题解:CF1997F Chips on a Line
观察发现如下事实:
- 所有操作可逆。
- 可以将所有棋子全部变成若干个
1 号棋子。
因此,所有棋子的花费与提供都是若干个
由于
预处理出用
之后统计出恰好
最后根据
预处理运算量为
为了节省篇幅,代码中 mint 表示取模整数。完整代码在这里。
#include<bits/stdc++.h>
using namespace std;
namespace _wrk{;
#define int long long
#define mod 998244353
#define mint modint<mod>
Math<mint,1000006>math;
int a[2323];
int n,m,x;
int c[60000];
mint p[1003][60003];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
a[1]=a[2]=1;
for(int i=3;i<=24;i++){
a[i]=a[i-1]+a[i-2];
}
memset(c,0x3f,sizeof(c));
c[0]=0;
for(int k=1;k<=24;k++){
for(int i=a[k];i<=a[10]*1000;i++){
c[i]=min(c[i],c[i-a[k]]+1);
}
}
int n,m,x;
cin>>n>>x>>m;
p[0][0]=1;
for(int i=1;i<=x;i++){
for(int f=1;f<=n;f++){
for(int j=a[i];j<=55*n;j++){
p[f][j]+=p[f-1][j-a[i]];
}
}
}
mint ans=0;
for(int i=1;i<=a[10]*1000;i++){
if(c[i]==m)ans+=p[n][i];
}
cout<<ans;
return 0;
}
}
signed main(){
return _wrk::main();
}