1. 程式人生 > >費馬小定理+快速冪:ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies

費馬小定理+快速冪:ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies

限制時間是1S,試了試Java的大數運算,超時了。發現雖然 N 的值大的可怕但結果是取餘後的,可以通過費馬小定理減小指數大小後快速冪得到結果。

快速冪運算時必須加上取餘, (a * b) % p = (a % p * b % p) % p

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MOD 1000000007
long long FastPowOf2(long long num)
{
	long long sp=1,base=2;
	while(num)
	{
		if(num&1)
			sp=(sp%MOD*base)%MOD;
		base=(base*base)%MOD;
		num>>=1;
	}
	return sp;
}
int main(int agrc,char **argv)
{
	char *BigArray=(char*)malloc(sizeof(int)*100005);
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		scanf("%s",BigArray);
		int i;
		long long sum;
		for(i=0,sum=0;i<strlen(BigArray);i++)
			sum=(sum*10+BigArray[i]-'0')%(MOD-1);
		printf("%lld\n",FastPowOf2(sum-1));
	}
	return EXIT_SUCCESS;
} 

END