【JZOJ】6271. 锻造 (forging)
Description
Time Limits: 1500 ms Memory Limits: 262144 KB
Input
第一行两个整数 n, a,含义如题所示。
为了避免输入量过大,第二行五个整数 bx, by, cx, cy, p,按照下列代码
来生成 b 和 c 数组。
b[0]=by+1;c[0]=cy+1;
for(int i=1;i<n;i++){
b[i]=((long long)b[i-1]*bx+by)%p+1;
c[i]=((long long)c[i-1]*cx+cy)%p+1;
}
Output
输出一行一个整数,表示期望花费。
Sample Input
Sample Input1
0 6432
4602677 3944535 2618884 6368297 9477531
Sample Input2
1 3639650
6136976 5520115 2835750 9072363 9302097
Sample Input3
10 2
2 33 6 66 2333333
Sample Input4
200 5708788
0 0 0 0 1
Sample Output
Sample Output1
6432
Sample Output2
150643649
Sample Output3
976750710
Sample Output4
696441597
Data Constraint
思路
对于每次合成x级(x>=2),是使用x-1,x-2级武器各一把来合。
设P为合成x级成功的概率,那么有:
概率为P合成x级,概率为(1-P)合成x-1级。
对于概率为(1-P)时,此次合成相当于浪费一把(x-2)级的武器。
设dp[i]
表示合成第i级武器的期望花费。
则有:dp[i]=dp[i-1]+dp[i-2]*(1/P)
其中1/P为合成次数的期望值,表示合了这么多次后,终于成功。
但是这题卡常,得先线性求一波逆元,转移时O(1)使用。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const long long ONE=1;
const int MAXN=10000007;
const int MOD=998244353;
int bx,by,cx,cy,p;
int N,A,b[MAXN],c[MAXN];
long long dp[MAXN],f[MAXN];
long long quick_Pow(long long x,int y){if(y==0)return 1;if(y==1)return x;if(y%2)return (x*quick_Pow((x*x)%MOD,y/2))%MOD;return quick_Pow((x*x)%MOD,y/2);
}
long long P(int i){if(i==0)return (c[0]*f[min(b[0],c[0])])%MOD;if(c[i]<=b[i-1])return 1;else return (c[i]*f[b[i-1]])%MOD;
}
int main(){freopen("forging.in","r",stdin);freopen("forging.out","w",stdout);f[0]=0;f[1]=1;for(int i=2;i<=1e7;i++)f[i]=MOD-(((MOD/i)*f[MOD%i])%MOD);scanf("%d%d",&N,&A);scanf("%d%d%d%d%d",&bx,&by,&cx,&cy,&p);b[0]=by+1;c[0]=cy+1;for(int i=1;i<N;i++){b[i]=(ONE*b[i-1]*bx+by)%p+1;c[i]=(ONE*c[i-1]*cx+cy)%p+1;}dp[0]=A;if(N>=1)dp[1]=(P(0)*dp[0]+dp[0])%MOD;for(int i=2;i<=N;i++)dp[i]=(dp[i-2]+dp[i-1]*P(i-1))%MOD;printf("%lld\n",dp[N]);
}
/*
0 6432
4602677 3944535 2618884 6368297 94775311 3639650
6136976 5520115 2835750 9072363 930209710 2
2 33 6 66 2333333200 5708788
0 0 0 0 1
*/
【JZOJ】6271. 锻造 (forging)相关推荐
- 6271. 2019.8.4【NOIP提高组A】锻造 (forging)
6271. 2019.8.4[NOIP提高组A]锻造 (forging) (File IO): input:forging.in output:forging.out Time Limits: 15 ...
- jzoj 6271. 2019.8.4【NOIP提高组A】锻造 (forging)
Description 详见OJ Solution 这题看题目就知道是期望\(DP\)了. 先刚了2h\(DP\)式,得到\(f[i]=f[i-1]+f[i-2]+f[i-1]*(1-p)+...\) ...
- 九校联考-DL24凉心模拟Day2T1 锻造(forging)
1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆都打不过了. 勇者的精灵路由器告诉 ...
- 【九校联考-24凉心模拟】锻造(forging)
题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打, 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自 己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他 ...
- 锻造 (forging)
文章目录 题目 分析 代码 题目 Description Input 第一行两个整数nnn,aaa,含义如题所示. 为了避免输入量过大,第二行五个整数bxbxbx,bybyby,cxcxcx,cycy ...
- 【JZOJ6271】锻造 (forging)
description analysis 首先看一下p=1p=1p=1,即111以后的合成一定成功的情况 如果按照求期望值的一般做法求两把000合成111的期望,会画出一棵无穷大的树 这个的期望值就是 ...
- 九校联考-DL24 凉心模拟 Day2T1 锻造 (forging)
题目描述 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他自己 ...
- 01 | 机械专业英语词汇
金属切削 metal cutting机床 machine tool金属工艺学 technology ofmetals刀具 cutter摩擦 friction联结 link传动 drive/transm ...
- 汽车英语词汇 (2012了 大家抓紧学习)
汽车英语词汇 (2012了 大家抓紧学习) 2012年01月08日 汽车英语词汇 中文名词 英语翻译 中文名词 英语翻译 工位 station 保险杠 bumper 内饰 trim 返工 re-doi ...
最新文章
- WinCE开机默认语言设置 .
- SVN中检出(check out) 和 导出(export) 的区别
- 火爆 GitHub 的 16 张机器学习速查表,值得收藏!
- CentOS Linux防火墙配置及关闭
- javascript --- [小练习]变量提升、优先级综合
- sql中怎么根据汉字的拼音首字母查询
- 12.2 新特性:锁信息获取之在线删除索引
- 第十五回(二):文会内战平分秋色 树下阔论使坏心焦【林大帅作品】
- GitHub 上数十个 NetBeans 开源项目被卷入供应链攻击
- Android:SQLiteOpenHelper数据库的两套API
- 深入了解什么是服务网格
- ORACLE成果,天天10问(四)
- 5万字、97 张图总结操作系统核心知识点
- JS控制DIV的显示隐藏 。js中radio的取值 。JS控制select的方法(摘取)。js 控制表单中SELECT
- linux usb 从芯片,新人求教,怎么烧录Linux系统到一个小芯片上?
- 工业控制网络通信协议概览 2020年7月27日
- 季琦:VC青睐的“攻城略地者”
- python_判断是否回文
- Hadsky_v6.4.2轻论坛短信插件
- C++中const int*, const int * const, 和 int const *区别
热门文章
- 上海联想计算机维修,联想笔记本在上海的官方修理点在哪里?
- java 交集_Java大集合求交集的方法比较
- java 数组求交集_Java数组的交集、并集
- LabView-之7: 移位寄存器
- oracle 变更字段名称_oracle怎么修改字段名称?
- 【C语言】通讯录设计
- 我正在参加博客之星评选,2022年「博客之星」参赛博主:小天狼星_布莱克
- 中国直播传媒产业高峰论坛在京成功举办
- form标签的action属性怎么用?form标签action属性的用法介绍(附实例)
- 深度解析:一文看懂CVPR 2017五大研究前沿