HDU-4704,数学题+费马小定理+快速幂

链接:http://hdu.hustoj.com/showproblem.php?pid=4704

Problem Description
 

Sample Input
 
  
2
 

Sample Output
 
  
2
Hint
1. For N = 2, S(1) = S(2) = 1.2. The input file consists of multiple test cases.


题意S(i)表示用i个数组成n有几种情况。只要顺序不一样就好。

求 S(1)+S(2)+...+S(n)%1000000007;

假设:An=S(1)+S(2)+...S(n)。

讨论A(n+1)的情况。划分出一个数位1,2,3,,,,n,则A(n+1)=A(1)+A(2)+....A(n)。

A(n+1)=A(1)+A(2)+....A(n)

A(n)=A(1)+A(2)+....A(n-1)。

两式一减得到A(n+1)-A(n)=A(n)。

2*A(n)=A(n+1)。

A(1)=1;

A(n)=2^(n-1);

答案就是2^(n-1)%1000000007;

A^X%M=A^(X%(M-1))%M。 A,M互质。

最后就是快速幂了。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll qu(ll n){
   ll ans=1,a=2;
   while(n){
    if(n%2) ans=ans*a%mod;
    a=a*a%mod;
    n/=2;
   }
   return ans;
}
int main(){
   char s[100005];
   while(~scanf("%s",s)){   
     ll sum=0;
     for(int i=0;s[i]!='\0';i++){
        sum=(sum*10+s[i]-'0')%(mod-1);
     }
     sum=(sum+mod-2)%(mod-1);
     printf("%lld\n",qu(sum));
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41713256/article/details/80529509