HZOI20190829模拟33题解

HZOI20190829模拟33题解,第1张

概述题面: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$ 然后等比数列求和 #

题面: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 longusing 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 longusing 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:赤壁情

咕咕咕~~

总结

以上是内存溢出为你收集整理的HZOI20190829模拟33题解全部内容,希望文章能够帮你解决HZOI20190829模拟33题解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1036670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存