标签:wing fine enter tar turn long 16px void c++
# 题意
给定n,m,求出 Tn = f(1)+2f(2)+......nf(n) 答案模m
# 题解
Tn = f(1)+2f(2)+......nf(n) 不好通过迭代计算
可以令Pn=nf(1)+(n-1)f(2)+......+f(n)
最后只要令n·Sn - Pn-1 即可
初始矩阵定为f(1)={1,1,1,0}
如果为f(1)={1,1,1,1} 那么需要计算矩阵的逆,比较麻烦,
可以直接令操作矩阵为
0 1 0 0
1 1 1 0
0 0 1 1
0 0 0 1
每次都是Pn=Sn+Pn-1 最后迭代到n就是Pn-1
1 #include <bits/stdc++.h> 2 #define faststd ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 3 #define ll long long 4 using namespace std; 5 int n,mod; 6 void mul(int f[4],int a[4][4]){ 7 int c[4]; 8 memset(c,0,sizeof c); 9 for(int i=0;i<4;i++) 10 for(int k=0;k<4;k++) 11 c[i]=(c[i]+((ll)f[k]*a[k][i])%mod)%mod; 12 memcpy(f,c,sizeof c); 13 } 14 void mulself(int a[4][4]){ 15 int c[4][4]; 16 memset(c,0,sizeof c); 17 for(int i=0;i<4;i++) 18 for(int j=0;j<4;j++) 19 for(int k=0;k<4;k++){ 20 c[i][j]=(c[i][j]+((ll)a[i][k]*a[k][j])%mod)%mod; 21 } 22 memcpy(a,c,sizeof c); 23 } 24 int main(){ 25 faststd 26 cin>>n>>mod; 27 int a[4][4]={ 28 {0,1,0,0}, 29 {1,1,1,0}, 30 {0,0,1,1}, 31 {0,0,0,1} 32 }; 33 int f[4]={1,1,1,0}; 34 int k=n-1; 35 while(k){ 36 if(k&1) mul(f,a); 37 mulself(a); 38 k>>=1; 39 } 40 cout<<((((ll)n * f[2]) % mod - f[3] % mod) % mod + mod) % mod<<endl; 41 return 0; 42 }
标签:wing fine enter tar turn long 16px void c++
原文地址:https://www.cnblogs.com/hhyx/p/12716774.html