HDU 2604
来源:互联网 发布:c语言面向对象编程 pdf 编辑:程序博客网 时间:2024/06/04 19:51
快速幂取模,快速矩阵幂取模
先利用DFA构造转移矩阵
详见AC博客http://hi.baidu.com/aekdycoin/item/f3a474a7ee3b0d218919d3ae
#include<cstdio>#include<cstring>using namespace std;typedef long long ll;int len,mod;ll tem[6][6];int main(){ int i,j,k; while(scanf("%d %d",&len,&mod)==2){ ll a[6][6]={{0,0,1,0,0,1},{0,0,0,0,0,1},{0,0,0,0,1,0},{0,0,0,1,1,0},{0,2,0,1,0,0},{2,0,1,0,0,0}}; ll t[6][6]={{1,0,0,0,0,0},{0,1,0,0,0,0},{0,0,1,0,0,0},{0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1}}; int l=len; while(l){ if(l%2){ for(i=0;i<=5;i++) for(j=0;j<=5;j++) for(k=0;k<=5;k++) tem[i][j]+=(t[i][k]*a[k][j])%mod; for(i=0;i<=5;i++) for(j=0;j<=5;j++){ t[i][j]=tem[i][j]%mod; tem[i][j]=0; } } for(i=0;i<=5;i++) for(j=0;j<=5;j++) for(k=0;k<=5;k++) tem[i][j]+=(a[i][k]*a[k][j])%mod; for(i=0;i<=5;i++) for(j=0;j<=5;j++){ a[i][j]=tem[i][j]%mod; tem[i][j]=0; } l/=2; } ll ans=1; ll m=2; while(len){ if(len%2) ans=(ans*m)%mod; m=(m*m)%mod; len/=2; } ans%=mod; printf("%I64d\n",(ans+mod*2-t[5][5]-t[4][5])%mod); } return 0;}
- hdu 2604
- HDU 2604
- (2604)HDU
- hdu 2604
- HDU HDU 2604 Queuing 矩阵乘法
- hdu 2604 Queuing
- hdu 2604 Queuing 矩阵
- hdu 2604 Queuing
- hdu 2604 queuing
- hdu 2604 - Queuing
- hdu 2604 Queuing
- HDU 2604-Queuing
- hdu 2604 Queuing 矩阵
- HDU 2604 Queuing
- HDU 2604 Queuing
- 【HDU 2604】 Queuing
- HDU 2604 Queuing
- HDU 2604 Queuing
- linux驱动-在PC机下编译驱动程序的Makefile
- hdu 4301 Divide Chocolate(DP)
- hdu4372(count buildings)
- freeswitch 通道变量 翻译
- linux内核线程和 kthread_worker
- HDU 2604
- Poco::Timer
- with as 的使用说明
- 修养结束
- Form Reset
- 数论剩余系学习
- WCF简单实例(VS2010自动生成)--服务端
- getClass().getName()
- POJ 1654 Area(任意多边形面积)