swust oj 1614 取模 (快速二分冪,降冪)
阿新 • • 發佈:2019-02-08
題意很簡單,來看資料範圍,x高精度,y是1e8,先用高精度模擬取模,再求x^y,這裡可以用快速二分冪搞一下。
然後還有另外一種做法,這裡的y是1e8,可以用尤拉函式先對y降冪,再暴力求x^y,也行。
這裡主要看一下尤拉函式的降冪公式吧
降冪公式:a^x ≡a^(x modϕ(p)+ϕ(p)) (mod p)
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<vector> using namespace std; char x[2000]; long long y,z; long long phi(long long n) { //直接法求尤拉函式值 int res=n,a=n; int i; for(i=2;i*i<=a;i++) { if(a%i==0) { res-=res/i; while(a%i==0) a/=i; } } if(a>1) res-=res/a; return res; } int main() { while(scanf("%s%lld%lld",x,&y,&z)!=EOF) { long long fc=phi(z); long long tmp=y%fc+fc; long long tx; long long tmpx=0; int len=strlen(x); for(int i=0;i<len;i++) { tmpx=tmpx*10+x[i]-'0'; tmpx%=z; } long long ans=1; for(int i=1;i<=tmp;i++) { ans*=tmpx; ans%=z; } printf("%lld\n",ans); } return 0; }