1. 程式人生 > >swust oj 1614 取模 (快速二分冪,降冪)

swust oj 1614 取模 (快速二分冪,降冪)

題意很簡單,來看資料範圍,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;
}