题意:
f[0]=0,f[i]=f[i-1]+a or b.
求满足L<=∑f[n]<=R的序列的种数
n<100. |a|,|b|<=10000. |L|,|R|<1e9
Solution
其实就是一个背包问题.
当a=b,序列 0 a a+a和 0 b b+b 竟然算不同的序列= =,巨坑
#include <iostream>
#define LL long long
using namespace std;
const int MOD = (int) 1e9 + ;
const int M = ; LL N, a, b, L, R;
LL dp[][ * ]; int main() {
dp[][] = ;
for (int i = ; i <= M; i++)
for (int j = ; j <= (i * (i - ) / ); j++) {
dp[i][j] = (dp[i - ][j] + dp[i][j]) % MOD;
dp[i][j + i] = (dp[i - ][j] + dp[i][j + i]) % MOD;
} for (int i = ; i <= M; i++)
for (int j = (i + ) * i / - ; j >= ; j--)
dp[i][j] = (dp[i][j + ] + dp[i][j]) % MOD; while (cin >> N >> a >> b >> L >> R) {
if (a > b) swap (a, b);
LL s = a * ( + N) * N / ;
if (s <= R && b != a ) {
LL nl = (L - s ) / (b - a), nr = (R - s) / (b - a) + ;
if ( (L - s) % (b - a) != ) nl++;
if (L - s <= ) nl = ;
if (nl > (N + ) *N / ) nl = (N + ) * N / + ;
if (nr > (N + ) *N / ) nr = (N + ) * N / + ;
cout << (MOD + dp[N][nl] - dp[N][nr]) % MOD << endl;
}
else if (s >= L && s <= R && b == a) {
LL ans = ;
for (int i = ; i <= N; i++)
ans = (ans * ) % MOD;
cout << ans << endl;
}
else
cout << << endl;
}
return ;
}