hdu 3221 矩阵幂乘 + 超大a*b%c
2017-01-06 23:01
267 查看
熟悉挑战上的矩阵幂乘法
找了最久的bug 就是这段代码, 不能直接% 就是 有种M周期后不是 0的东东
以及求欧拉函数少写了一个i *i
找了最久的bug 就是这段代码, 不能直接% 就是 有种M周期后不是 0的东东
for(int n1=0;n1<A.size();n1++){ for(int m2=0;m2<B[0].size();m2++){ for(int m1=0;m1<A[0].size();m1++){ C[n1][m2]=(C[n1][m2]+A[n1][m1]*B[m1][m2]%M)%M; } } }
以及求欧拉函数少写了一个i *i
#include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<cmath> #include<iostream> using namespace std; const long long maxn=100000*5; typedef long long ll; typedef vector<ll> vec; typedef vector<vec> mat; ll M; mat mul(mat &A,mat &B){ mat C(A.size(),vec(B[0].size())); for(int n1=0;n1<A.size();n1++){ for(int m2=0;m2<B[0].size();m2++){ for(int m1=0;m1<A[0].size();m1++){ C[n1][m2]=(C[n1][m2]+A[n1][m1]*B[m1][m2]); if(C[n1][m2]>M){ C[n1][m2]=(C[n1][m2]%M)+M; } } } } return C; } mat pow(mat A,ll n){ mat B(A.size(),vec(A.size())); for(int i=0;i<A.size();i++){ B[i][i]=1; } while(n>0ll){ if(n&1ll) B=mul(B,A); A=mul(A,A); n>>=1ll; } return B; } typedef pair<ll,ll> P; P cal(ll n){ P p; if(n==1){ p.first=1;p.second=0; }else if(n==2){ p.first=0;p.second=1; }else if(n==3){ p.first=1;p.second=1; }else{ mat A(2,vec(2)); mat B(2,vec(2)); { A[0][0]=1; A[0][1]=1; A[1][0]=1; A[1][1]=0; } { B[0][0]=1; B[0][1]=1; B[1][0]=1; B[1][1]=0; } A=pow(A,n-3ll); B=pow(B,n-2ll); ll x= A[0][0]*1ll+A[0][1]*0ll; ll y= B[0][0]*1ll+B[0][1]*0ll; p.first=x;p.second=y; } return p; } ll powm(ll x,ll n,ll pmod){ ll res=1; while(n>0ll){ if(n&1ll) res=res*x%pmod; x=x*x%pmod; n>>=1ll; } return res; } ll getol(ll n){ ll ans=n; for(ll i=2;i*i<=n;i++){ if(n%i==0ll){ ans-=ans/i; while(n%i==0ll){ n/=i; } } } if(n>1ll) ans-=ans/n; return ans; } int main() { // freopen("D://in.txt","r",stdin); int cas; cin>>cas; ll a,b,n,pmod; for(int ik=1;ik<=cas;ik++){ cin>>a>>b>>pmod>>n; M=getol(pmod); P p=cal(n); ll res; res=powm(a,p.first,pmod)%pmod; res=(res*(powm(b,p.second,pmod)%pmod))%pmod; // printf("%I64d %I64d %I64d\n",M ,p.first,p.second); printf("Case #%d: %I64d\n",ik,res); } return 0; }
相关文章推荐
- hdu 3221 Brute-force Algorithm(快速幂取模,矩阵快速幂求fib)
- HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
- hdu 3221 矩阵乘法和 A^x = A^(x % Phi(C) + Phi(C)) (mod C)(x>=phi(c))
- Hdu 3221 Brute-force Algorithm (矩阵 欧拉定理降幂)
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
- HDU 3221 上海09 B题 矩阵乘法 数论
- HDU 3221 Brute-force Algorithm(矩阵求fibnacci,指数取模)
- hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)
- HDU 1575 Tr A (矩阵快速幂入门)
- HDU 2870 Largest Submatrix(最大完全子矩阵之不可移动列)
- hdu2371之矩阵快速幂
- hdu 1575 矩阵快速幂模板题
- HDU 2156 分数矩阵
- HDU 2256 Problem of Precision 构造矩阵
- HDU_2256 矩阵快速幂 需推算
- HDU 2276 Kiki & Little Kiki 2 矩阵构造和乘法
- Hdu 5015 233 Matrix (矩阵乘法)
- HDU 4686 Arc of Dream (矩阵快速幂)
- 2013 Multi-University Training Contest 9(hdu 4686 - 4691)dp(好)+矩阵快速幂+一般图匹配带花树+后缀数组
- poj -- 2778 DNA Sequence && hdu -- 2243 考研路茫茫——单词情结(AC自动机 + 矩阵)