NC232851. 分数游戏
描述
输入描述
输入一行四个整数 (, , )
输出描述
输出一行一个整数,表示可能的游戏数。
示例1
输入:
1 2 2 1
输出:
6
说明:
示例2
输入:
1 1 1 2
输出:
31
示例3
输入:
2 12 3 1
输出:
0
C++(clang++ 11.0.1) 解法, 执行用时: 72ms, 内存消耗: 1784K, 提交时间: 2022-10-07 17:37:16
#include<bits/stdc++.h> using namespace std ; #define ll long long const int mod = 1e9 + 7 , N = 410005 ; int a,b,k,t ; int f[2][N] ; ll get(int x) { return (f[t&1][x]-f[t&1][x-1]+mod)%mod ; } int main() { cin>>a>>b>>k>>t ; int pos=201005 ; f[0][pos]=1 ; for(int i=1,op=1;i<=t;++i,op^=1) { int Vm = i*k ; for(int j=-Vm;j<=Vm;j++) { int maxv=min(j+k,(i-1)*k) ; int minv=max(j-k,-(i-1)*k) ; f[op][j+pos]=(f[op^1][maxv+pos]-f[op^1][minv-1+pos]+mod)%mod ; } for(int j=-Vm;j<=Vm;j++) f[op][j+pos]=(f[op][j+pos]+f[op][j+pos-1])%mod ; } int v=b-a ; long long ans=0 ; int Vmax=t*k,Vmin=-t*k ; for(int i=Vmin;i<=Vmax;++i) { int vk=i+v ; if(vk<=Vmax) ans=(ans+(f[t&1][Vmax+pos]-f[t&1][vk+pos]+mod)%mod*get(i+pos)%mod)%mod ; } cout<<ans<<'\n' ; return 0 ; }