【扩展欧拉定理-降幂大法】Balkan OI 2016[数塔]题解
2017-12-21 20:58
246 查看
题目概述
求 xx⋮xn21 mod p 。解题报告
欧拉定理: aφ(p)≡1(mod p)⇔ab≡ab mod φ(p)(mod p) ,可以用来降幂,但是只适用于 gcd(a,p)=1 。实际上有扩展欧拉定理:
gcd(a,p)=1 : ab≡ab mod φ(p)(mod p)
gcd(a,p)>1
b<p : ab≡ab(mod p)
b≥p : ab≡ab mod φ(p)+φ(p)(mod p)
证明?我不会啊!然后就可以实现降幂了,这道题直接暴搞就行了QAQ。
示例程序
#include<cstdio> #include<cctype> #include<algorithm> #define fr first #define sc second #define mp make_pair using namespace std; typedef long long LL;typedef pair<int,bool> data; const int maxn=1000000,maxm=1000000; int te,m,n,x[maxn+5]; int p[maxm+5],phi[maxm+5];bool pri[maxm+5]; #define Eoln(x) ((x)==10||(x)==13||(x)==EOF) inline char readc() { static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF;return *l++; } inline int readi(int &x) { int tot=0,f=1;char ch=readc(),lst='+'; while (!isdigit(ch)) {if (ch==EOF) return EOF;lst=ch;ch=readc();} if (lst=='-') f=-f; while (isdigit(ch)) tot=(tot<<3)+(tot<<1)+ch-48,ch=readc(); return x=tot*f,Eoln(ch); } void Make() { pri[1]=true;phi[1]=1; for (int i=2;i<=m;i++) { if (!pri[i]) p[++p[0]]=i,phi[i]=i-1; for (int j=1,t;j<=p[0]&&(t=p[j]*i)<=m;j++) { if (i%p[j]) phi[t]=phi[i]*phi[p[j]],pri[t]=true; else {phi[t]=phi[i]*p[j];pri[t]=true;break;} } } } int gcd(int a,int b) {if (!b) return a;return gcd(b,a%b);} inline data Pow(LL w,int b,int MOD) { LL s=1;bool fl=true; while (b) { if (b&1) {if ((s*=w)>=MOD) fl=false;s%=MOD;} b>>=1;if (b) {if ((w*=w)>=MOD) fl=false;w%=MOD;} } return mp(s,fl); } data Solve(int st,int MOD) { if (MOD==1) return mp(0,false);if (st==n) return mp(x[st]%MOD,x[st]<MOD); data b=Solve(st+1,phi[MOD]);if (gcd(x[st],MOD)==1) return Pow(x[st],b.fr,MOD); if (!b.sc) b.fr+=phi[MOD];return Pow(x[st],b.fr,MOD); } int main() { freopen("program.in","r",stdin); freopen("program.out","w",stdout); readi(te);readi(m);Make(); while (te--) { readi(n);for (int i=1;i<=n;i++) readi(x[i]); printf("%d\n",Solve(1,m).fr); } return 0; }
相关文章推荐
- [ 扩展欧拉定理 ] Balkan OI 2016 paper-towers
- hdu3221 扩展欧拉定理(降幂大法)
- [欧拉回路] 「Balkan OI 2016」Acrobat
- [欧拉回路 dfs树] Balkan OI 2016 Acrobat
- 【BZOJ 3884】 上帝与集合的正确用法 (扩展欧拉定理降幂)
- [欧拉回路] 「Balkan OI 2016」Acrobat
- 2016微软探星夏令营在线技术笔试题解(3)
- 【题解】HNOI-2016大数
- URAL 1141. RSA Attack(欧拉定理+扩展欧几里得+快速幂模)
- NOIP2016 模拟赛[一中题]题解&总结
- 欧拉定理 & 费马定理吗 & 欧几里得 & 扩展欧几里得
- BZOJ4755: [JSOI2016]扭动的回文串——题解
- 2016 百度之星 Problem B --(大整数,斐波那契数列,java大法好)
- 网易2016研发工程师编程题 - 题解
- 借助扩展事件查看SQL 2016备份和还原操作的内幕
- NOIP2016 普及组第四题 魔法阵magic 题解
- Yandex.Algorithm 2016 Online Round 2 题解(待补)
- {题解}[jzoj4841]【NOIP2016提高A组集训第4场11.1】平衡的子集
- 逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)
- 【BZOJ】【P2395】【Balkan 2011】【Timeismoney】【题解】【最小乘积生成树】