hdu 4704 Sum

来源:互联网 发布:java制作记事本 编辑:程序博客网 时间:2024/06/03 21:10

题意:求整数划分的个数,即求 2^n % mod   (n<=10^100000)的值

解析: 费马小定理,2^n=2^(x+k*(mod-1)) 而 2^(mod-1)%mod=1  (a*b)%mod=((a%mod)*(b%mod))%mod


#include<iostream>#include<stdio.h>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef  __int64 LL;const __int64 Mod= 1000000007;char num[100006];LL powk(LL a,LL n){    LL r=1,p=a;    while(n>0)    {      int bit=n&1;      if(bit==1) r=(r*p)%Mod;      p=(p*p)%Mod;      n>>=1;    }    return r;}LL gets(LL mod){   LL p=0,len=strlen(num);   for(int i=0;i<len;i++)   {       p=p*10+num[i]-'0';       p=p%mod;   }   p=(p-1+mod)%mod;   return p;}int main( ){  int i,j,len;  LL mod11;  while(~scanf("%s",&num))  {      mod11=gets(Mod-1);      printf("%I64d\n",powk(2,mod11));  }  return 0;}


原创粉丝点击