计蒜客NOIP模拟赛(2) D2T2紫色百合
【问题描述】
“牵着你的手的是她,路边开满了紫色的百合花……”
你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’。你想挑出其中一些组成“一束百合花”且价值在二进制下恰好为一个‘1’后面P个‘0’,那么有多少种挑选方案呢?
定义“一束百合花”的价值为这些百合花组成的集合的所有子集的权值乘积的和(空集的权值乘积算1)。如价值为1和3组成的一束百合花价值为1+1+3+1*3=8
【输入格式】
一行两个正整数N,P,含义如题目中所示n,p<=100000
【输出格式】
一个整数代表方案数模 998244353 的结果
【样例输入1】
3 3
【样例输出1】
2
【样例输入2】
233 666
【样例输出2】
572514965
稍稍运用一下数学知识发现题目要求的是选出的集合每个元素+1之后的乘积等于2^P的方案数,取个log就变成了↓
在1~N选若干个数使得总和等于P,求方案数
然后用普通的背包DP可以就拿到60分了
然后我们发现,由于物品大小是1~N,所以最多选取O(sqrt(P))个物品,背包就满了
满分做法可以用状态f[i][j]表示选i个物品,占容量为j的方案数
由于每个背包是不同的,所以根据已选的最小的物品分类讨论一下:
如果最小的物品是1,相当于i-1个物品凑出了j-i的大小,然后整体+1
如果最小的物品不是1,相当于i个物品凑出了j-i的大小,然后整体+1
需要注意我们要防止出现选择了大小为N+1的物品的情况,所以需要减去
得到递推式f[i][j]=f[i-1][j-i]+f[i][j-i]-f[i-1][j-(N+1)]
时间复杂度O(Nsqrt(N))
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long long lol; 7 lol Mod=998244353; 8 int f[451][100011]; 9 lol ans; 10 lol n,p; 11 int main() 12 {lol i,j; 13 cin>>n>>p; 14 f[0][0]=1; 15 for (i=1;i*(i+1)/2<=p;i++) 16 { 17 for (j=i;j<=p;j++) 18 { 19 f[i][j]=f[i-1][j-i]+f[i][j-i]; 20 if (j>=(n+1)) f[i][j]-=f[i-1][j-n-1]; 21 if (f[i][j]<0) f[i][j]+=Mod; 22 if (f[i][j]>=Mod) f[i][j]-=Mod; 23 } 24 ans=(ans+f[i][p])%Mod; 25 } 26 cout<<ans%Mod; 27 }
【问题描述】
“牵着你的手的是她,路边开满了紫色的百合花……”
你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’。你想挑出其中一些组成“一束百合花”且价值在二进制下恰好为一个‘1’后面P个‘0’,那么有多少种挑选方案呢?
定义“一束百合花”的价值为这些百合花组成的集合的所有子集的权值乘积的和(空集的权值乘积算1)。如价值为1和3组成的一束百合花价值为1+1+3+1*3=8
【输入格式】
一行两个正整数N,P,含义如题目中所示
【输出格式】
一个整数代表方案数模 998244353 的结果
【样例输入1】
3 3
【样例输出1】
2
【样例输入2】
233 666
【样例输出2】
572514965
【数据范围与约定】
测试点编号 |
N |
P |
1 |
≤ 8 |
≤ 100 |
2 |
≤ 12 |
≤ 100 |
3 |
≤ 15 |
≤ 100 |
4 |
≤ 100 |
≤ 100 |
5 |
≤ 1000 |
≤ 1000 |
6 |
≤ 2000 |
≤ 2000 |
7 |
≤ 100000 |
≤ 100000 |
8 |
≤ 100000 |
≤ 100000 |
9 |
≤ 100000 |
≤ 100000 |
10 |
≤ 100000 |
≤ 100000 |
转载于:https://www.cnblogs.com/Y-E-T-I/p/7496356.html
计蒜客NOIP模拟赛(2) D2T2紫色百合相关推荐
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...
- 计蒜客NOIP模拟赛(2) D1T1邻家男孩
凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...
- 计蒜客NOIP模拟赛 数三角形
数三角形 题目描述 刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张 ...
- 计蒜客NOIP模拟D1T2
原题: 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少.另外,由于各种原因,蒜头君的树的边的边权会发生若干次改变,蒜头君想让你告诉他,每一次改变后,任意两点间最短距离 ...
- 【计蒜客信息学模拟赛1月月赛 - B】蒜头套圈圈(贪心,前缀最大值)
题干: 蒜头去嘉年华玩儿套圈圈,是这么玩儿的.有一些瓶口口径不同的啤酒瓶,瓶子里面有一些奖品.如果蒜头用手上的圈圈套中了啤酒瓶,那么奖品就归他了. 假设蒜头君无限精准,指哪儿打哪儿,并且蒜头了解到,只 ...
- 【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位)
题干: 如果一个数大于等于 10且任意连续两位都是质数,那么就称之为 Wish 数.当然,第一个 Wish 数是 11. 比如 97,111,131,119 都是 Wish 数,而 12,136 则不 ...
- 【计蒜客2017NOIP模拟赛1】
D1T1 题面 题解:一开始以为傻题,旋转个坐标系就行了,结果光荣爆零~ 结果发现旋转坐标系后,由于多了一些虚点,锤子砸到虚点上了~gg [没有代码] D1T2 题面 题解:计算出每个边对答案的贡献即 ...
- 计蒜客一月入门赛:《三个火枪手》题解
题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...
最新文章
- 平均14915元,2021 年 1 月程序员工资统计出炉
- es修改排序_java 如何实现ElasticSearch自定义排序
- C~K的班级_JAVA
- 关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
- 视频:参加ZDNet《小崔说事》谈知识管理
- 使用Spring Security的多租户应用程序的无状态会话
- Python类与对象实验
- sql server driver for php,Microsoft SQL Server Driver for PHP
- c++ 写入文件_Python学习第52课-写入文件
- mate10支持html,华为Mate 10再曝光:配置强劲,全面屏十分惊艳
- Spring源码解析(五)——自定义标签解析
- windows服务器nginx日志分割
- 计算机硬件人员专业知识技能,电子计算机(微机)装配调试员
- 【场景化解决方案】OA审批与金蝶云星空集成
- ROC、PR曲线、AUC值
- html表格新插入一列,VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-...
- pyqt:让qlabel的图片根据鼠标指向的位置进行放缩
- 洗地机哪个牌子好?口碑最好的洗地机
- lj245a引脚功能图_急,谁能提供给我74ls245的功能说明和引脚图,谢谢了
- 《经济半小时》 20130906 指尖上的商机(五)数据时代