標籤:
從題意,anw = (b-1)*b^(n-1)%c,強調,為了b^(n-1)。
弱渣只能推了宣傳。
phi(c)為小於c且與c互質的個數。
當x >= phi(c)時:A^x = A(x%phi(c) + phi(c)) 。
當x < phi(c)時:直接求就可以。
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <cmath>#include <stack>#include <map>#include <ctime>#include <iomanip>#pragma comment(linker, "/STACK:1024000000");#define EPS (1e-6)#define _LL long long#define ULL unsigned long long#define LL __int64#define INF 0x3f3f3f3f#define Mod 1000000007/** I/O Accelerator Interface .. **/#define g (c=getchar())#define d isdigit(g)#define p x=x*10+c-'0'#define n x=x*10+'0'-c#define pp l/=10,p#define nn l/=10,ntemplate<class T> inline T& RD(T &x){ char c; while(!d); x=c-'0'; while(d)p; return x;}template<class T> inline T& RDD(T &x){ char c; while(g,c!='-'&&!isdigit(c)); if (c=='-') { x='0'-g; while(d)n; } else { x=c-'0'; while(d)p; } return x;}inline double& RF(double &x) //scanf("%lf", &x);{ char c; while(g,c!='-'&&c!='.'&&!isdigit(c)); if(c=='-')if(g=='.') { x=0; double l=1; while(d)nn; x*=l; } else { x='0'-c; while(d)n; if(c=='.') { double l=1; while(d)nn; x*=l; } } else if(c=='.') { x=0; double l=1; while(d)pp; x*=l; } else { x=c-'0'; while(d)p; if(c=='.') { double l=1; while(d)pp; x*=l; } } return x;}#undef nn#undef pp#undef n#undef p#undef d#undef gusing namespace std;char s[1000010];int B[1000010],N[1000010];LL c,b,n;bool vis[1000010];LL prime[1000010];int Top;LL Euler(LL n){ LL ret=1,i; for(i=2; i*i<=n; i++) { if(n%i==0) { n/=i,ret*=i-1; while(n%i==0) n/=i,ret*=i; } } if(n>1) ret*=n-1; return ret;}LL Cal(int *n,LL c,bool &mark){ LL re = 0; for(int i = 0; n[i] != -1; ++i) { re *= 10,re += n[i]; if(re >= c) mark = true,re %= c; } return re;}LL qm(LL a,LL b,LL n){ LL ret=1; LL tmp=a; while(b) { if(b&1) ret=ret*tmp%n; tmp=tmp*tmp%n; b>>=1; } return ret;}int main(){ int i,j; scanf("%s",s); for(i = 0; s[i] != '\0'; ++i) B[i] = s[i]-'0'; B[i] = -1; scanf("%s",s); for(i = 0; s[i] != '\0'; ++i) N[i] = s[i]-'0'; N[i] = -1; scanf("%I64d",&c); LL MAXN = sqrt(c); memset(vis,false,sizeof(vis)); Top = 0; for(i = 2; i <= MAXN; ++i) if(vis[i] == false) for(j = i+i,prime[Top++] = i; j <= MAXN; j += i) vis[j] = true; LL phi = Euler(c),b1; bool mark = false; b = Cal(B,c,mark); mark = false; n = Cal(N,phi,mark); b1 = (b-1+c)%c; if(mark == true) n = (n-1+phi)%phi + phi; else n--; LL anw = b1*qm(b,n,c)%c; if(anw == 0) anw = c; printf("%I64d\n",anw); return 0;}
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
Codeforces 17D Notepad 簡單的數論