首页 > 代码库 > Bzoj2219 数论之神

Bzoj2219 数论之神

Time Limit: 3 Sec  Memory Limit: 259 MB
Submit: 954  Solved: 268

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)

Output

输出一行,表示答案

Sample Input

3
213 46290770 80175784
3 46290770 80175784
3333 46290770 80175784

Sample Output

27
27
297

HINT

 新加数组一组--2015.02.27

Source

数论 鸣谢 AekdyCoin

 

数学问题  原根 阶 指标 中国剩余定理 脑洞题

吼题

 

学姐的讲解很棒棒 http://blog.csdn.net/regina8023/article/details/44863519

 

模数$P=2*K+1$很大,在这个范围下没什么方法可以有效计算,所以需要优化数据范围。

将P分解质因数,$p_{1}^{a1}+p_{2}^{a2}+p_{3}^{a3}+...$

分别在每个模$ p_{i}^{ai} $ 的意义下计算出答案,将这些答案累乘起来就是最终的答案。(在每个模意义下选出一个解,则构成了一组同余方程,根据中国剩余定理,每组同余方程对应一个唯一解,所以可以用乘法原理统计总答案数)

假设当前我们在处理一个$p^{a}$

现在需要求$x^a \equiv b (\mod  p^{a})$的解个数

 

 

 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #define LL long long 7 using namespace std; 8 const int mod=1e9+7; 9 const int mxn=1000010;10 int read(){11     int x=0,f=1;char ch=getchar();12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}14     return x*f;15 }16 int n;17 int a[mxn];18 int f[mxn];19 int main(){20 //    freopen("in.txt","r",stdin);21     int i,j,cnt=0;22     n=read();23     for(i=1;i<=n;i++){a[i]=read();if(a[i]==1)cnt++;}24     f[0]=1;f[1]=1;f[2]=2;25     for(i=3;i<=cnt;i++)f[i]=((LL)f[i-1]+(LL)f[i-2]*(i-1)%mod)%mod;26     for(i=n;i>cnt;i--)f[cnt]=(LL)f[cnt]*i%mod;27     printf("%d\n",f[cnt]);28     return 0;29 }

 

Bzoj2219 数论之神