正题
题目链接:https://www.luogu.org/problem/U86650?contestId=23574
题目大意
第一年有nnn只鸡,每只大于等于两岁的鸡每年可以生一只,在ttt岁时不会生鸡而会暴毙。
现在给出每只鸡的年龄,求第mmm年鸡的总数量。
解题思路
用fif_{i}fi表示年龄为iii的鸡的数量,然后矩乘优化即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=75;
struct matrix{ll a[N][N];
}f,ans;
ll n,t,m,XJQ,num;
matrix operator*(const matrix &a,const matrix &b){matrix c;memset(c.a,0,sizeof(c.a));for(ll i=0;i<t;i++)for(ll j=0;j<t;j++)for(ll k=0;k<t;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j]%XJQ)%=XJQ;return c;
}
matrix power(matrix x,ll b){matrix ans=x;b--;while(b){if(b&1) ans=ans*x;x=x*x;b>>=1;}return ans;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);ans.a[0][x]++;}scanf("%lld%lld%lld",&t,&m,&XJQ);for(ll i=1;i<t;i++)f.a[i-1][i]++,f.a[i][0]++;f.a[t-1][0]--;f=power(f,m-1);ans=ans*f;for(ll i=0;i<t;i++)num=(num+ans.a[0][i])%XJQ;printf("%lld",num);
}