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
数学问题 原根 阶 指标 中国剩余定理 脑洞题
吼题
学姐的讲解很棒棒 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 }