HZOI20190829模拟33题解
题面:https://www.cnblogs.com/Juve/articles/11436771.html
A:春思
我们对a分解质因数,则$a=\prod\limits_p^{p|a}p^k$
所以$a^b=\prod\limits_p^{p|a}p^{k*b}$
所以$ans=\prod\limits_p^{p|a}\sum\limits_{q=0}^{k*b}p^q$
然后等比数列求和
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=1e2+5;
const int mod=9901;
int a,b,num[MAXN],sum=0,ans=1,d[MAXN];
int q_pow(int a,int b,int p){
int res=1;
while(b){
if(b&1) (res*=a)%=p;
(a*=a)%=p;
b>>=1;
}
return res;
}
signed main(){
scanf("%lld%lld",&a,&b);
for(int i=2;i*i<=a;i++){
if(a%i==0){
d[++sum]=i;
while(a%i==0){
num[sum]++;
a/=i;
}
(num[sum]*=b)%=(mod-1);
}
}
if(a>1) d[++sum]=a,num[sum]=b%(mod-1);
for(int i=1;i<=sum;i++)
(ans*=(q_pow(d[i]%mod,(num[i]+1)%(mod-1),mod)-1+mod)%mod*q_pow((d[i]-1)%mod,mod-2,mod)%mod)%=mod;
printf("%lld\n",ans);
return 0;
}
B:密州盛宴
如果我们统计后缀和,规定1为+1,0为-1,则如果有后缀和小于-1就不合法
如果中间出现了小于-1的情况,就把一个0放到第一的位置,然后把当前位置前的所有数向后移一位
因为我们要找的是操作的最大值,所以把所有数向后移一定是优的
然后统计这样的情况
但其实我们发现,对于上面的方法,扫一遍整个字符串,找出后缀最小值,然后答案就是最小值的相反数减一
然后我们优化这种方法
我们发现有循环的字符串
那么我们在每一个循环的字符串上统计答案
我们知道如果这一段字符串的和大于0,那么我们在第一段的时候更新答案
如果小于0,那么在最后一段更新答案
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=1e6+5;
int n,m,ans,res,cnt=0;
char ch[MAXN];
struct node{
int t,sum,len,minn,cnt;
}in[MAXN];
signed main(){
while(~scanf("%lld%lld",&n,&m)){
if(n+m==0) break;
ans=0x7ffffffffffffff;res=cnt=0;
for(int i=1;i<=m;i++){
scanf("%s%lld",ch+1,&in[i].t);
in[i].len=strlen(ch+1);
in[i].minn=0x7ffffffffffffff;
in[i].sum=in[i].cnt=0;
for(int j=in[i].len;j>=1;j--){
if(ch[j]=='1') in[i].cnt++;
in[i].sum+=(ch[j]=='1'?1:-1);
in[i].minn=min(in[i].minn,in[i].sum);
}
cnt+=in[i].cnt*in[i].t;
}
if(cnt<n){
puts("-1");
continue;
}
in[m+1].sum=in[m+1].t=0;
for(int i=m;i>=1;i--){
res+=in[i+1].sum*in[i+1].t;
if(in[i].sum>=0){
ans=min(ans,res+in[i].minn);
}else{
ans=min(ans,res+in[i].sum*(in[i].t-1)+in[i].minn);
}
}
if(ans>=0) puts("0");
else printf("%lld\n",-ans-1);
}
return 0;
}
C:赤壁情
咕咕咕~~
**dp
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
int n,m,k,now=1,pre=0,bnd[105],base;
double ans=0;
void print(double a,int k){
if(k==0) printf("%0.0lf\n",a);
else if(k==1) printf("%0.1lf\n",a);
else if(k==2) printf("%0.2lf\n",a);
else if(k==3) printf("%0.3lf\n",a);
else if(k==4) printf("%0.4lf\n",a);
else if(k==5) printf("%0.5lf\n",a);
else if(k==6) printf("%0.6lf\n",a);
else if(k==7) printf("%0.7lf\n",a);
else if(k==8) printf("%0.8lf\n",a);
else if(k==9) printf("%0.9lf\n",a);
}
double f[2][105][3][15015];
void work1(){
base=7500;
f[now][1][0][base-2]=f[now][1][2][base]=1;
f[now][1][1][base-1]=2;
bnd[1]=1;
for(int i=2;i<=n;i++){
now^=1;pre^=1;
bnd[i]=min(i,n-i+1);
int size=min(7500,i*(i+1));
for(int j=1;j<=bnd[i];j++){
for(int l=-size+base;l<=size+base;l++)
for(int k=0;k<=2;k++)
f[now][j][k][l]=0;
}
for(int j=1;j<=bnd[i-1];j++){
for(int l=-size+base;l<=size+base;l++){
f[now][j+1][0][l-i*2]+=f[pre][j][0][l]*(j+1);
f[now][j][0][l]+=f[pre][j][0][l]*j*2;
f[now][j-1][0][l+i*2]+=f[pre][j][0][l]*(j-1);
f[now][j+1][1][l-i]+=f[pre][j][0][l]*2;
f[now][j][1][l+i]+=f[pre][j][0][l]*2;
f[now][j+1][1][l-2*i]+=f[pre][j][1][l]*j;
f[now][j][1][l]+=f[pre][j][1][l]*(j*2-1);
f[now][j-1][1][l+2*i]+=f[pre][j][1][l]*(j-1);
f[now][j+1][2][l-i]+=f[pre][j][1][l];
f[now][j][2][l+i]+=f[pre][j][1][l];
f[now][j+1][2][l-2*i]+=f[pre][j][2][l]*(j-1);
f[now][j][2][l]+=f[pre][j][2][l]*(j*2-2);
f[now][j-1][2][l+2*i]+=f[pre][j][2][l]*(j-1);
}
}
}
for(int i=m;i<=base;i++) ans+=f[now][1][2][i+base];
for(int i=2;i<=n;i++) ans/=(double)i;
print(ans,k);
return ;
}
int floor(__float128 x){
for(int i=9;i>=0;--i){
if(x>=i)
return i;
}
}
void print__float128(__float128 x,int ws){
int sta[55];sta[0]=0;
for(int i=1;i<=ws;++i){
x*=10;
sta[i]=floor(x);
x-=floor(x);
}
x*=10;
if(floor(x)>=5) sta[ws]++;
for(int i=ws;i;--i){
if(sta[i]==10) sta[i]=0,sta[i-1]++;
}
printf("%d.",sta[0]);
for(int i=1;i<=ws;++i) printf("%d",sta[i]);
puts("");
}
__float128 dp[2][105][3][15015];
void work2(){
base=2000;
dp[now][1][0][base-2]=dp[now][1][2][base]=1;
dp[now][1][1][base-1]=2;
bnd[1]=1;
for(int i=2;i<=n;i++){
now^=1;pre^=1;
bnd[i]=min(i,n-i+1);
int size=min(2000,i*(i+1));
for(int j=1;j<=bnd[i];j++){
for(int l=-size+base;l<=size+base;l++)
for(int k=0;k<=2;k++)
dp[now][j][k][l]=0;
}
for(int j=1;j<=bnd[i-1];j++){
for(int l=-size+base;l<=size+base;l++){
dp[now][j+1][0][l-i*2]+=dp[pre][j][0][l]*(j+1);
dp[now][j][0][l]+=dp[pre][j][0][l]*j*2;
dp[now][j-1][0][l+i*2]+=dp[pre][j][0][l]*(j-1);
dp[now][j+1][1][l-i]+=dp[pre][j][0][l]*2;
dp[now][j][1][l+i]+=dp[pre][j][0][l]*2;
dp[now][j+1][1][l-2*i]+=dp[pre][j][1][l]*j;
dp[now][j][1][l]+=dp[pre][j][1][l]*(j*2-1);
dp[now][j-1][1][l+2*i]+=dp[pre][j][1][l]*(j-1);
dp[now][j+1][2][l-i]+=dp[pre][j][1][l];
dp[now][j][2][l+i]+=dp[pre][j][1][l];
dp[now][j+1][2][l-2*i]+=dp[pre][j][2][l]*(j-1);
dp[now][j][2][l]+=dp[pre][j][2][l]*(j*2-2);
dp[now][j-1][2][l+2*i]+=dp[pre][j][2][l]*(j-1);
}
}
}
__float128 ans=0;
for(int i=m;i<=base;i++) ans+=dp[now][1][2][i+base];
for(int i=2;i<=n;i++) ans/=(__float128)i;
print__float128(ans,k);
return ;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
if(k<=8) work1();
else work2();
return 0;
}
HZOI20190829模拟33题解的更多相关文章
- noip模拟33[进阶啦啦啦]
noip模拟33 solutions 不知道该咋说,这场考试其实是我这三四场以来最最最最最顺心的一场了 为啥呢?因为我这回思考有很多结果,得到了脑袋的回复 就是你想了半个小时就有了一点点头绪,那感觉就 ...
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- noip模拟33
\(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...
- [NOIP模拟33]反思+题解
又考了一次降智题…… 拿到T1秒出正解(可能是因为我高考数学数列学的海星?),分解质因数以后用等比数列求和计算每个因子的贡献.但是当时太过兴奋把最后的$ans \times =$打成了$ans +=$ ...
- Noip模拟33垫底反思 2021.8.8
T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- 10.8 wtx模拟题题解
填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...
随机推荐
- php+jquery 上拉加载
<script type="text/javascript"> var resflow = true,pages =2; var ps=$("#ids&quo ...
- SpringBoot使用拦截器/ Servlet/ Filter
一.SpringBoot中使用拦截器 使用SpringMVC的拦截器,需要定义好拦截器,然后通过配置文件文件,对其进行注册 而在SpringBoot项目中,之前在配置文件中配置的内容,现在体现在一个类 ...
- The Preliminary Contest for ICPC Asia Nanjing 2019 C. Tsy's number 5
https://nanti.jisuanke.com/t/41300 题意:求\(\sum_{i=1}^n\phi(i)\phi(j)2^{\phi(i)\phi(j)}\) \(f_i=\sum_{ ...
- linux操作练习题
linux操作练习题 一.总结 一句话总结: 多练练一下子就会了,很简单的 1.在当前目录下建立文件exam.c,将文件exam.c拷贝到/tmp这个目录下,并改名为 shiyan.c? touch ...
- iServer添加Oracle Plus数据源、服务发布的问题
今天在将以Oracle Plus为数据源的工作空间发布成服务时,发现服务发布完后,看不见任何数据.最后发现,还需要在iserver服务器上安装oracle客户端才行.整理如下: 一.创建空间数据库账户 ...
- 现金贷平台下载量TOP100 涉逾30家P2P
一.什么是现金贷,现状如何 那么什么是现金贷呢?在笔者看来,狭义的现金贷主要是指基于互联网等技术手段的小额现金贷款,广义的现金贷可以包括任何以小额现金和存款为标的进行借贷的行为,是一种无担保.无抵押. ...
- System.Web.Mvc.HttpDeleteAttribute.cs
ylbtech-System.Web.Mvc.HttpDeleteAttribute.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral ...
- 如何用excel统计调查问卷
如何用excel统计调查问卷 有些人可能经常要对调查问卷进行统计,使用手写的方法(就是在纸上写正字的方法)虽然很方便,不过不方便在一定条件下进行统计,如在男士的条件下,使用诺基亚的手机有多少人.而用e ...
- Windows下 vundle的安装和使用
准备工作 1. 安装git 去官网下载,安装即可. 2. 添加git的环境变量 并将Git 的安装路径加入环境变量Path,如 D:\Program Files\Git\cmd 然后运行cmd,输入 ...
- HTTP协议基础篇(帮助理解)
用uml 来描述一个功能是怎样按照时间的顺序完成的 实际的需求(配置网站/配置虚拟主机) 步骤 (1) 打开 apache/conf/httpd.conf 文件 (2)找到hosts文件 c:/win ...