数论

BZOJ 1406 - 伪数论

你说的曾经没有我的故事 提交于 2020-04-06 10:40:59
本来以为用一些奇妙的枚举顺序可以直接卡过去,然后弃疗。。 由题意可得 x^2 = 1 (mod n) ==> x^2 = k*n+1 ==> (x+1)(x-1) = k*n ==> n | (x+1)(x-1) 然后枚举n的约数。设n=a*b (a<b),若枚举a,就可求出b。然后令 a | (x+1),b | (x-1)。枚举可以被b整除的数(因为b>a),再判断它+2是否能被a整除。反过来再判断一次。如果(x+1)和(x-1)分别获得a、b中的因子,那么一定也会被其他情况枚举到,即做到了不重不漏。 代码中也有很多小坑。。 // BZOJ 1406 #include <cstdio> #include <cstring> #include <set> #include <algorithm> using namespace std; #define rep(i,a,b) for (int i=a; i<=b; i++) #define dep(i,a,b) for (int i=a; i>=b; i--) #define read(x) scanf("%d", &x) #define fill(a,x) memset(a, x, sizeof(a)) int n; set<int> S; int main() { read(n); int s=0; for (int i=1;

BZOJ 1406 数论

≡放荡痞女 提交于 2020-04-06 08:25:36
思路: $x^2=kn+1$ $x^2-1=kn$ $(x+1)(x-1)=kn$ 令$x+1=k1n1$,$x-1=k2n2$,其中$k1k2=k$,$n1n2=n$ 枚举n约数 >=$\sqrt{n}$的,代入验证 去重 //By SiriusRen #include <set> #include <cstdio> using namespace std; #define int long long int n;set<int>s; signed main(){ scanf("%lld",&n); if(!n){puts("None");return 0;} for(int i=1;i*i<=n;i++)if(n%i==0){ int res=n/i; for(int j=1;j<=n;j+=res)if((j+1)%i==0)s.insert(j); for(int j=res-1;j<=n;j+=res)if((j-1)%i==0)s.insert(j); }for(set<int>::iterator it=s.begin();it!=s.end();++it)printf("%d\n",*it); } 来源: https://www.cnblogs.com/SiriusRen/p/6592632.html

[学习笔记]多项式开根

99封情书 提交于 2020-04-02 05:56:50
多项式总结 https://blog.csdn.net/semiwaker/article/details/73251486 是一个汇总 1.基础 FFT [学习笔记]FFT——快速傅里叶变换 分治,点值-》乘积-》插值 NTT [学习笔记]NTT——快速数论变换 用原根代替单位根 FWT [学习笔记]FWT——快速沃尔什变换 分治,点值-》乘积-》插值。按位考虑。&和|的意义比较明显 FMT [学习笔记]高维前缀和 其实不算是多项式,稍微提及一下 按位前缀和。是FWT&卷积的第一步。好写,但是可以用FWT代替 2.进阶 多项式求逆 [学习笔记]NTT——快速数论变换 思路是把mod x^(n/2)->mod x^n使得可以递归处理 多项式除法 [学习笔记]NTT——快速数论变换 考虑先求出商 所以干掉余数,mod x^(n-m+1) 干掉余数的同时,恰好为商保留了n-m位,求出的商就是答案。 分治FFT [学习笔记]分治FFT cdq分治FFT,处理计算顺序的trick 任意模数NTT [学习笔记]NTT——快速数论变换 答案不会很大<=10^23,选择三个模数,使得mod m1m2m3的值就是真实值 分别NTT,CRT合并。合并时候为了防止爆long long 有小trick 多项式插值 [学习笔记]拉格朗日插值 思想类似CRT,把有关i的多余的东西删掉 点值合适的话,可以O

数论总结

时间秒杀一切 提交于 2020-03-30 08:56:23
一:扩展欧拉定理的一种更简便的写法 void exgcd(int a,int b,int &d,int &x,int &y){ if(b) exgcd(b, a % b, d, y, x), y -= x * (a / b); else x = 1, y = 0, d = a; } 二:线性求逆元,若$a*i+b=p,a=\lfloor \frac{p}{i} \rfloor,b=p%i$则$\frac{1}{i}=-\frac{a}{b}$ inv[1] = 1; for(int i=2; i<=n; i++) inv[i] = p - (p / i) * inv[p % i] % p; 三:大步小步算法,求$a^x=b(mod p)$,令$k=\sqrt{p},0<c<=k,0<=d<k$,原式可转化为$a^{ck-d}=b$,即$a^{ck}=b*a^d$,用hash表保存每一个$b*a^d$,最后依次检验即可 时间复杂度$O(\sqrt{n})$ 来源: https://www.cnblogs.com/PHDHD/p/12596445.html

Openjudge-NOI题库-旅行-数论

旧街凉风 提交于 2020-03-18 04:35:55
题目描述 Description 转眼毕业了,曾经朝夕相处的同学们不得不都各奔东西,大家都去了不同的城市开始新的生活。在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。 输入输出格式 Input/output 输入格式: 一个正整数n(n<200),表示人数。 输出格式: 一个数,表示有多少不同的方案。 输入输出样例 Sample input/output 样例测试点#1 输入样例: 3 输出样例: 2 提示: 有如下两种方案: 同学1去同学2的城市,同学2去同学3的城市,同学3去同学1的城市。 同学1去同学3的城市,同学3去同学2的城市,同学2去同学1的城市。 思路:      为了简化题目,以下我用“元素”表示每位同学,用“位置”表示他们所到达的城市,当n个元素放在n个位置,我们可以用D(n)表示元素与位置各不对应的方法数,那么D(n-1)就表示n-1个元素放在n-1个位置,D(n-1)则表示n-1个元素所产生的的各不对应的方法数,以此类推:   第一步:我们可以把第n个元素放在一个位置k,一共有n-1种放法。   第二步:放编号为k的元素,这时候就会出现两种情况: ①将它放到n原来所在的位置

Bzoj2219--数论之神

女生的网名这么多〃 提交于 2020-03-12 18:48:49
Description 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出满足 (1) X^A = B(mod 2*K + 1) (2) X 在范围[0, 2K] 内的X的个数!自然数论之神是可以瞬间秒杀此题的,那么你呢? Input 第一行有一个正整数T,表示接下来的数据的组数( T <= 1000) 之后对于每组数据,给出了3个整数A,B,K (1 <= A, B <= 10^9, 1 <= K <= 5 * 10^8) ----------------------------------------------此后一千里--------------------------------------------------------- 毒瘤出题人,毁我青春。。。 说正事。。要求模的p并不是一个质数,所以我们先考虑中国剩余定理把它拆开。 我们发现对于每个x^A = B mod pi^ai的解的个数乘起来就是原等式的解的个数,因为拆出的每个方程的解表示原方程的解模拆出的素数幂的值,假设我们拆出了k个方程,那么这k个方程的解和原解又可以建立一个k个方程的方程组,每种不同的方程组都对应原方程一个不同的解,所以原解的个数是拆开后方程解个数的乘积。

(数论推理)Harmonic Number (II)

两盒软妹~` 提交于 2020-03-11 14:21:56
挺有趣的一道题。 求出前sqrt(n)项和:即n/1+n/2+…+n/sqrt(n) 而(n/1-n/2)就是后面项中1.x的个数 (n/2-n/3)就是后面项中2.x的个数 依次类推。。。 举两个例子: n/1-n/2 = 5; 1.x n/2-n/3 = 2 2.x n/3-n/4 = 1 3.x <----- 重复,要减掉 n/1-n/2 = 10 1 n/2-n/3 = 4 2 n/3-n/4 = 1 3 n/4-n/5 = 1 4 由于n/sqrt(n) != sqrt(n) 故不存在重复的问题。 # include <bits/stdc++.h> using namespace std ; typedef long long ll ; int main ( ) { int t , cnt = 0 ; scanf ( "%d" , & t ) ; while ( t -- ) { ll n ; scanf ( "%lld" , & n ) ; ll ans = 0 ; ll x = sqrt ( n ) ; for ( ll i = 1 ; i <= x ; i ++ ) { ans + = ( n / i ) ; ans + = ( n / i - n / ( i + 1 ) ) * i ; } if ( n / x == x ) { ans - = x ; }

[CF1316C] Primitive Primes - 数论

拜拜、爱过 提交于 2020-03-11 08:45:56
给定两个序列 \(a,b\) ,保证每个序列中所有数字的 GCD 为 \(1\) ,设 \(a*b=c\) ,给定质数 \(p\) ,求 \(t\) 使得 \(c_t\) 不能被 \(p\) 整除 \(n,m \leq 10^6, x \leq 10^9\) Solution 要使 \(c_i \bmod p \neq 0\) ,则 \(a_0b_i, a_1b_{i-1}, \dots, a_ib_0\) 中至少有一项满足 \(a_xb_y \neq 0 \bmod p\) ,这要求 \(a_x,b_y \neq 0 \bmod p\) ,于是我们只需要按下标从小到大找到第一个 \(a_i \neq 0, b_j \neq 0 \bmod p\) ,那么 \(i+j\) 就是答案 考虑充分性,设第一个不能被 \(p\) 整除的是 \(a_i,b_j\) ,那么对于 \(c_{i+j}\) ,它的其它项中一定都含有 \(p\) 因子 来源: https://www.cnblogs.com/mollnn/p/12460175.html

数论——HDU-1576

情到浓时终转凉″ 提交于 2020-02-28 11:44:59
题目链接 A/B≡x mod 9973 要我们求出这个x 转换式子就是 A/B=x+9973*k A/B=x+9973*k 因为B整除A,所以A=B*X+9973*k*B 取模得到 A-B*x≡0 mod 9973 => n-B*x≡0 x显然在0-9972,遍历一下就能找到最小的x了 题目代码 #include<iostream> #include<stdio.h> #include<string.h> #include<vector> using namespace std; const int maxn=1e8+100; typedef long long LL; int t,n; LL b; int main(){ scanf("%d",&t); while(t--){ scanf("%d%lld",&n,&b); int x; for(x=0;x<9973;x++){ LL t=b*x-n; if(t%9973==0)break; } printf("%d\n",x); } return 0; } 来源: https://www.cnblogs.com/helman/p/11352437.html

数论:关于逆元

不问归期 提交于 2020-02-26 14:51:04
数论:关于逆元 之前写过一篇逆元的文章,但是由于我掌握不牢,所以现在连不定方程都不会解,在此进行补充升华(buyiding) 这就是逆元的简易求法 若ax+by=1. 那么x就是a对模b的逆元,同理,y就是b对模a的逆元. 这时,就要用到Exgcd来快速求出逆元. 在此之前,逆元存在的前提是a,b互质.(如果不互质,那么等号右边就换成gcd(a,b)). 这时通过欧几里得算法,a=gcd(a,b)=1时,等式化为x=1. 也就是说1对模0的逆元是1. 我们知道a,b化为1,0时,是辗转相除的到的,那么对于任意一对a,b,满足a=bm+n. b对模a的逆元可以分解为b对模(mb+n)的逆元.转化为yb%(mb+n)=1. 不难看出,对于mb+n的mb项,yb%mb永远不可能出现1.那么1只能通过%n得到.这时候就是b模n的逆元x0的作用. 设x0,使x0b%n=1.又因为a=mb+n,所以不光是n,y(b模a的逆元)里面还要考虑mb的问题,而mb是b的倍数,每个n会和m个b同时出现,n的数量成了解决问题的关键.(一开始,可能会想到x0b/n,但是写出公式后发现这样会出现0循环(因为x0可能为0)) 引出n对模b的逆元y0. y0n%b=1.但是我是用y个b取模(mb+n),n的数量要求n(x0b/n)(向下取整)=x0b-1,这时,就要去n和某个数的乘积%b=-1(也就是b-1).