bzoj2219: 数论之神【中国剩余定理+原根+BSGS】
2018-01-09 20:43
405 查看
解题思路:
这道题真是把几个数论知识完美融合,题解可以看这里,非常详细。#include<bits/stdc++.h> #define ll long long using namespace std; const int INF=0x3f3f3f3f; int T,num,cnt,f[100000]; struct node { int p,c,pc; }a[105]; map<int,int>Map; int Pow(int x,int y,int mod) { int res=1; for(;y;y>>=1,x=(ll)x*x%mod) 4000 if(y&1)res=(ll)res*x%mod; return res; } int gcd(int a,int b) { return b?gcd(b,a%b):a; } void div(int x) { num=0; for(int i=2;i*i<=x;i++) if(x%i==0) { a[++num].p=i,a[num].c=0,a[num].pc=1; while(x%i==0)x/=i,a[num].c++,a[num].pc*=i; } if(x!=1)a[++num].p=a[num].pc=x,a[num].c=1; } int getroot(int p,int phi) { int c=0; for(int i=2;i*i<=phi;i++) if(phi%i==0)f[++c]=i,f[++c]=phi/i; for(int g=2;;g++) { int i; for(i=1;i<=c;i++) if(Pow(g,f[i],p)==1)break; if(i==c+1)return g; } } int BSGS(int A,int B,int C) { int n;A%=C,B%=C; for(n=1;(ll)n*n<C;n++); Map.clear(); int now=1; for(int i=0;i<n;i++) { Map[(ll)now*B%C]=i+1; now=(ll)now*A%C; } A=Pow(A,n,C); now=1; for(int i=1;i<=n;i++) { now=(ll)now*A%C; if(Map[now])return i*n-(Map[now]-1); } return 0; } int solve(int A,int B,int i) { int phi=a[i].pc-a[i].pc/a[i].p; int g=getroot(a[i].pc,phi); int idx=BSGS(g,B,a[i].pc); int res=gcd(phi,A); if(idx%res!=0)return 0; return res*Pow(a[i].p,cnt-cnt/A,INF); } int main() { //freopen("lx.in","r",stdin); scanf("%d",&T); while(T--) { int A,B,k,p; scanf("%d%d%d",&A,&B,&k); p=2*k+1; div(p); int ans=1; for(int i=1;i<=num;i++) { if(!ans)break; if(B%a[i].pc==0)ans*=Pow(a[i].p,a[i].c-(a[i].c-1)/A-1,INF); else { int b=B;cnt=0; while(b%a[i].p==0) b/=a[i].p,a[i].pc/=a[i].p,a[i].c--,cnt++; if(cnt%A!=0)ans=0; else ans*=solve(A,b,i); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 20140714 「初等数论 - 中国剩余定理」 POJ 1006 Biorhythms
- 数论E - Biorhythms(中国剩余定理,一水)
- 数论基础_中国剩余定理
- 数学基础II 线性基 高斯消元 中国剩余定理 BSGS
- 【数论】中国剩余定理
- 数论 - 中国剩余定理 (互质|非互质)
- ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯)
- 数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】
- HDU 5768 Lucky7 数论 中国剩余定理
- 数论-中国剩余定理
- [省选前题目整理][SGU 261]Discrete Roots(扩展欧几里得+中国剩余定理+原根+大步小步算法)
- 数论复习之中国剩余定理
- 一些关于中国剩余定理的数论题(POJ 2891/HDU 3579/HDU 1573/HDU 1930)
- 数论学习(3)——中国剩余定理
- [数论] 组合数取模 中国剩余定理 Lucas定理
- (ACM数论)中国剩余定理(孙子定理)
- 数论学习之同余 中国剩余定理
- 基础数论算法(4) 中国剩余定理
- 数论/中国剩余定理
- 【数论】中国剩余定理