2019 IEEEXtreme 13.0 题解记录
时间:2019-10-20
本文章向大家介绍2019 IEEEXtreme 13.0 题解记录,主要包括2019 IEEEXtreme 13.0 题解记录使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
比赛时间 2019.10.19 8:00 - 2019.10.20 8:00
比赛网站 https://csacademy.com/ieeextreme13
// 连续24小时做题真的是极限体验
// 刚比完躺了醒来就会做压轴题了,吐血 = =
Alfa Pool
题目大意
有一种比赛的计分规则为:相邻得分下一次将加倍,两次连续不得分则终止比赛,每次从1开始得分。计算有多少种方式使总分为B, B = 5 的全部情况如下表。询问包含 N 组,每次求总分为 \(B_i\) 的方案数对 1e9+7 取模的结果。
1 X 1 X 1 X 1 X 1 X X
X 1 X 1 X 1 X 1 X 1 X X
1 2 X 1 X 1 X X
X 1 2 X 1 X 1 X X
1 X 1 2 X 1 X X
X 1 X 1 2 X 1 X X
1 X 1 X 1 2 X X
X 1 X 1 X 1 2 X X
数据范围
- \(1≤N≤10^4\)
- \(0 \leq B_i≤10^5\)
解题思路
分别尝试直接爆搜,分块爆搜(每一块得分为 \(2^k -1\)) 都 TLE ,只通过了一组测试。
由于答案没有递推性质,打表找不出规律,队友通过OEIS大法找到了该问题的数列,但求法太复杂,遂放弃。
注意到 B 不超过 1e5,最大的一部分得分为 \(2^16 - 1=65535\),那么全部能选的分数只有 16 种可能。
考虑设 dp[n][k] : 总得分为 n 最后一部分得分为 \(2^k-1\) 的方案数(1<=k<=16),那么就可以写出状态转移方程了。
const int p[17] = {0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
// Ans[n][0] : 总得分为 n 的全部方案数
Ans[i][0] += Ans[i][j] (1<=j<=16)
Ans[i+p[j]][j] += Ans[i][0] (1<=j<=16)
// 答案即为 2*Ans[B][0]
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
const int mod = 1e9+7;
const int p[17] = {0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
int Ans[100010][17];
// Ans[n][0] : ans[n]
void init() {
Ans[0][0] = 1;
for(int i=0;i<=100000;i++) {
for(int j=1;j<=16;j++) {
Ans[i][0] = (Ans[i][0] + Ans[i][j]) % mod;
}
for(int j=1;j<=16;j++) {
if(i+p[j]<=100000)
Ans[i+p[j]][j] = (Ans[i+p[j]][j] + Ans[i][0]) % mod;
}
}
}
int main() {
init();
int n; cin>>n;
while(n--) {
int B;
scanf("%d", &B);
if(B==0) printf("1\n");
else
printf("%d\n", 2*Ans[B][0]%mod);
}
return 0;
}
原文地址:https://www.cnblogs.com/izcat/p/11707465.html
- Python在VSCode中进入交互界面调试
- CentOS7下单机部署RabbltMQ环境的操作记录
- Flash/Flex学习笔记(24):粒子效果
- 针对业务日志的监控报警设置
- 对广晟有色的数据分析
- Flash/Flex学习笔记(22):滤镜学习
- Python输出信息
- Flash/Flex学习笔记(21):利用colorTransform改变对象的颜色及透明度
- 网站访问状态和超时时间监控报警设置
- 为treeview添加客户端事件
- Flash/Flex学习笔记(20):贝塞尔曲线
- 磁盘挂载问题:Fdisk最大只能创建2T分区的盘,超过2T使用parted
- asp.net中几种页面元素的比较
- Flash/Flex学习笔记(19):颜色合成与分解的基本原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法