• hdu4704之费马小定理+整数快速幂


    Sum

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 589    Accepted Submission(s): 292

    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.
     
    /*分析:题目要求s1+s2+s3+...+sn;//si表示n划分i个数的n的划分的个数,如n=4,则s1=1,s2=3
    假设An=s1+s2+s3+...+sn;
    对于n可以先划分第一个数为n,n-1,n-2,...,1,则容易得出An=A0+A1+A2+A3+...+A(n-1);
    =>A(n+1)=A0+A1+A2+A3+...+An =>An=2^(n-1);
    由于n非常大,所以这里要用到费马小定理:a^(p-1)%p == 1%p == 1;//p为素数
    所以2^n%m == ( 2^(n%(m-1))*2^(n/(m-1)*(m-1)) )%m == (2^(n%(m-1)))%m * ((2^k)^(m-1))%m == (2^(n%(m-1)))%m;//k=n/(m-1)
    */
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<iomanip>
    #define INF 99999999
    using namespace std;
    
    const int MAX=100000+10;
    const int mod=1000000000+7;
    char s[MAX];
    
    __int64 MOD(char *a,int Mod){
    	__int64 sum=0;
    	for(int i=0;a[i] != '';++i){
    		sum=(sum*10+a[i]-'0')%Mod;
    	}
    	return sum;
    }
    
    __int64 FastPow(__int64 a,__int64 k){
    	k=(k+mod)%mod;
    	__int64 sum=1;
    	while(k){
    		if(k&1)sum=sum*a%mod;
    		a=a*a%mod;
    		k>>=1;
    	}
    	return sum;
    }
    
    int main(){
    	while(scanf("%s",s)!=EOF){
    		__int64 n=MOD(s,mod-1)-1;
    		printf("%I64d
    ",FastPow(2,n));
    	}
    	return 0;
    }
  • 相关阅读:
    mysql服务器上的mysql这个实例中表的介绍
    mysql的innodb存储引擎和myisam存储引擎的区别
    Ubuntu配置java环境变量
    Android_adb shell am/pm使用
    tty相关内容
    Ubuntu和windows共享文件夹
    蓝牙查询网站
    Vim折叠模式设置
    ubuntu下安装jdk
    Linux下Gcc生成和使用静态库和动态库详解
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3297032.html
Copyright © 2020-2023  润新知