HDU 4704 Sum(費馬小定理,組合數學,快速冪)
阿新 • • 發佈:2018-12-27
Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2738 Accepted Submission(s): 1140
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.
思想:根據組合數學,總是為2^n,根據費馬小定理縮小n的範圍,再矩陣快速冪即可求出答案。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstring> #include<string> #include<algorithm> using namespace std; #define ms(a,b)memset(a,b,sizeof(a)) #define eps 1e-10 #define inf 1e8 typedef long long ll; typedef vector<ll> vec; typedef vector<vec> mat; const ll M=1000000007; ll mod_pow(ll x,ll n) { ll ans=1; while(n>0) { if(n&1) ans=(ans*x)%M; x=x*x%M; n>>=1; } return ans; } int main() { ll a,b,n; string s; ll ans=0; while(cin>>s) { ans=0; for(int i=0;i<s.length();i++) { ans=ans*10+s[i]-'0'; ans%=(M-1); } ans--; cout<<mod_pow(2,ans)<<endl; } return 0; }
JAVA:(TLE)
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { BigInteger n; Scanner cin=new Scanner(System.in); while(cin.hasNextBigInteger()){ n=cin.nextBigInteger(); n=n.subtract(BigInteger.ONE); n=n.mod(new BigInteger("1000000006")); System.out.println(mod_pow(new BigInteger("2"),n,new BigInteger("1000000007"))); } } public static BigInteger mod_pow(BigInteger x,BigInteger n,BigInteger mod) { BigInteger res=new BigInteger("1"); while(n.compareTo(BigInteger.ZERO)>0) { if(n.mod(new BigInteger("2")).compareTo(BigInteger.ONE)==0) { res=res.multiply(x); res=res.mod(mod); } x=x.multiply(x); x=x.mod(mod); n=n.divide(new BigInteger("2")); } return res; } }