列表

详情


NC232851. 分数游戏

描述

M和L在玩一个分数游戏。开始时M的分数为a,L的分数为b。每一轮他们两个都会得到区间中的一个整数,并加到他们的分数上。

M想知道在t轮游戏后,他有多少种可能得到比L高的分数。两次游戏不同当且仅当存在某一轮某一人得到的数不同。游戏共有种不同的可能。故只需求出对取模后的结果即可。

输入描述

输入一行四个整数a,b,k,t (, , )

输出描述

输出一行一个整数,表示可能的游戏数。

示例1

输入:

1 2 2 1

输出:

6

说明:

在第一个样例中,若L得到-2,M可以在得到0,1,2的情况下获胜。若L得到-1,M可以在得到1,2的情况下获胜。若L得到0,M可以在得到2的情况下获胜。综上,共有3+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 ;
}

上一题