题目大意:Memory 和 Lexa分别取数,取ttt轮,每一轮取的数字的范围为[−k,k][−k,k][−k,k],并且将取的数字加他们的得分,问有多少种方案Memory的得分严格大于Lexa。Memory和Lexa分别的初始分数为a,ba,ba,b


解题思路
我们设f[i][j]为从第i轮抽数之后这些数之和为j的方案数.我们设f[i][j]为从第i轮抽数之后这些数之和为j的方案数.我们设f[i][j]为从第i轮抽数之后这些数之和为j的方案数.
那么f[i][j]=∑k=j−kj+kf[i−1][k]那么f[i][j]=\sum_{k=j-k}^{j+k}f[i-1][k]那么f[i][j]=∑k=j−kj+k​f[i−1][k]
因为取值范围是[−k,k]中间可能会出现负数因为取值范围是[-k,k]中间可能会出现负数因为取值范围是[−k,k]中间可能会出现负数
那么我们就将区间迁移以一下[0,2k]那么我们就将区间迁移以一下[0,2k]那么我们就将区间迁移以一下[0,2k]
我们还可以优化一下因为对于f[i]的每一个j都只是用了上一层f[i−1]的数值我们还可以优化一下因为对于f[i]的每一个j都只是用了上一层f[i-1]的数值我们还可以优化一下因为对于f[i]的每一个j都只是用了上一层f[i−1]的数值
那么我们就可以预处理出上一层的前缀和sum[j]那么我们就可以预处理出上一层的前缀和sum[j]那么我们就可以预处理出上一层的前缀和sum[j]


但我们得到f[i][j]之后我们就可以枚举Memory的最后的加上的数值为x但我们得到f[i][j]之后我们就可以枚举Memory的最后的加上的数值为x但我们得到f[i][j]之后我们就可以枚举Memory的最后的加上的数值为x
那么Lexa的加上的分数就是∈[0,x−(b−a)−1]那么Lexa的加上的分数就是\in[0,x-(b-a)-1]那么Lexa的加上的分数就是∈[0,x−(b−a)−1]
同理我们也可以预处理前缀sum∈[0,x−(b−a)−1];同理我们也可以预处理前缀sum\in[0,x-(b-a)-1];同理我们也可以预处理前缀sum∈[0,x−(b−a)−1];


下面看代码下面看代码下面看代码


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define rep_(i,a,b) for( int i = (a); i >= (b); -- i)
#define for_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 2e5+1010, mod = 1e9 + 7;
const double eps = 1e-10;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int a, b, K, T;
ll dp[110][N];//表示第i论得分为j的方案数
ll sum[N];
int main()
{read(a,b,K,T);dp[0][0] = 1;_rep(i,1,T){_rep(j,0,2*K*T+100)//细节这里注意范围因为a-b可能会是-99sum[j] = ((j ? sum[j - 1] : 0) + dp[i-1][j])%mod;_rep(j,0,2*K*T+100)dp[i][j] = (sum[j] - (j - 2 * K - 1 >= 0 ? sum[j - 2 * K - 1] : 0) + mod) % mod;}int EPS = b - a;ll ans = 0;_rep(i,0,2*K*T+100)sum[i] = ((i ? sum[i - 1] : 0) + dp[T][i]) % mod;_rep(i,EPS+1,2*K*T){ll res = 0;res = sum[i-EPS-1] % mod;ans = (ans + res * dp[T][i] % mod) % mod;}cout << ans << endl;return 0;
}

组合计数 ---- Codeforces Round #370 (Div. 2)D. Memory and Scores[dp]相关推荐

  1. Codeforces Round #370 (Div. 2) A. Memory and Crow 水题

    A. Memory and Crow 题目连接: http://codeforces.com/contest/712/problem/A Description There are n integer ...

  2. Codeforces Round #370 (Div. 2)E. Memory and Casinos[期望概率+线段树区间合并]详细推导

    题目链接 题目大意:就说一个赌徒在nnn个赌场里面转,在每个赌场他有pip_ipi​的胜率,如果赢了就向右走,输了就向左走,如果到达000或者n+1n+1n+1号赌场就相当退出的了赌局.定义统治区间[ ...

  3. 组合数学题 Codeforces Round #108 (Div. 2) C. Pocket Book

    题目传送门 1 /* 2 题意:每一次任选i,j行字符串进行任意长度前缀交换,然后不断重复这个过程,问在过程中,第一行字符串不同的个数 3 组合数学题:每一列不同的字母都有可能到第一行,所以每列的可能 ...

  4. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

  5. Codeforces Round #268 (Div. 1) C. Hack it! 数位dp + 构造数位

    传送门 文章目录 题意: 思路: 题意: 定义f(x)f(x)f(x)表示xxx的十进制下数位和,现在给你aaa,让你选一个区间[l,r][l,r][l,r],满足∑i=lrf(i)moda=0\su ...

  6. Codeforces Round #741 (Div. 2) E. Rescue Niwen! 字符串 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串sss,定义其扩张串为s1,s1s2,...,s1s2..sn,s2,s2s3,...,sns_1,s_1s_2,...,s_1s_2..s_n,s ...

  7. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  8. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  9. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...

最新文章

  1. OpenGL概念辨析: 窗口,视口,裁剪区域
  2. Linux服务端最大并发数是多少?
  3. ionic之点击放大图片
  4. AI版「按图索骥」,比猜画小歌更复杂的的AI交互游戏
  5. Protocol Buffer搭建及示例
  6. 《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止
  7. android 图片长方形_android 相机只拍摄矩形区域图片
  8. django 性能优化_优化Django管理员
  9. python调用c++的库传递二级指针
  10. Arduino文档阅读笔记-RFID工作原理及RC522模块介绍
  11. django “如何”系列4:如何编写自定义模板标签和过滤器
  12. 《葵花宝典:WPF自学手册》三大网点书评集萃
  13. HFSS学习笔记—19.HFSS模型导出dxf文件并绘制PCB
  14. 电磁波传播matlab程序,电磁波在不同介质中传播的 MATLAB 仿真教学实践论文
  15. android studio引入lib,Android studio项目引入另外一个项目做为Lib
  16. CRUD矩阵方法 实例
  17. Kaggle:Quora Question Pairs
  18. 鸿蒙音响怎么调,专业音响师必知的EQ调整小技巧
  19. OpenGL实现图片边缘暗角效果(1)
  20. 互动作业显示服务器异常,互动作业打不开怎么办 互动作业打不开解决方法

热门文章

  1. MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):
  2. 算法工程师面试必考项:二叉树
  3. 七大Github机器学习热门项目
  4. 手把手用YOLO做目标检测
  5. 基于K-Means聚类算法的主颜色提取
  6. SpringBoot基于AOP实现自定义非空验证的注解
  7. 阿里云文件存储极速型NAS产品介绍
  8. 15.知识产权与标准化
  9. JavaWeb项目实现文件下载
  10. java Timer定时器管理类