第五届蓝桥杯省赛C++A组 波动序列
一、题意转化
用di代表每一项的加数,会发现其实s是nx+di的后缀和,转化方程后,由于x为整数,可以很容易地得到s与di的后缀和mod n同余,也就是求最终结果为s mod n的后缀和方案数。
二、学到滴东西
同余转化、dp求方案数
三、代码.qaq、
#include#define rep(i,x,n) for(int i=x;i<=n;i++) using namespace std; const int mod=1e8+7; int n,s,a,b; int f[1010][1010]; main() { cin >> n >> s >> a >> b; f[0][0]=1;//求方案首先对初状态初始化为1 rep(i,1,n) rep(j,0,n) f[i][j]=(f[i-1][((j-a*(n-i))%n+n)%n]+f[i-1][((j+b*(n-i))%n+n)%n])%mod; //i-1到i的状态转移所有方案 cout << f[n-1][(s%n+n)%n]; }