Rt.
Wa 在最后一个点:Wrong Answer.wrong answer On line 1 column 1, read 2, expected 8.
code:
#include <iostream>
#include <cstdio>
#include <map>
#define int long long
using namespace std;
const int N = 1e6 + 5, MOD = 1e9 + 7;
int n, k, d, fac[N], inv[N], f[30][N], ans;
int C(int x, int y)
{
return (fac[x] * inv[x - y] % MOD) * inv[y] % MOD;
}
int qpow(int x, int y)
{
int res = 1;
while(y)
{
if(y & 1) (res *= x) %= MOD;
(x *= x) %= MOD;
y >>= 1;
}
return res;
}
signed main()
{
scanf("%lld %lld %lld", &n, &k, &d);
fac[0] = 1;
for(int i = 1;i <= 1e5;i++) fac[i] = (fac[i-1] * i) % MOD;
inv[100000] = qpow(fac[100000], MOD - 2);
for(int i = 1e5;i > 0;i--) inv[i-1] = (inv[i] * i) % MOD;
f[0][0] = 1;
for(int i = 0;i <= 13;i++)
for(int j = 0;j <= n - k;j++)
for(int l = 0;(l << i) <= n - k && l <= (k >> 1);l += d + 1)
(f[i + 1][j + (l << i)] += f[i][j] * C(k >> 1, l) % MOD) % MOD;
for(int i = 0;i <= n - k;i++)
(ans += f[14][i] * C(n - i - (k >> 1), k >> 1) % MOD) %= MOD;
printf("%lld\n", (C(n, k) - ans + MOD) % MOD);
return 0;
}
PS:不排除有弱智错误。