首页 > 其他分享 >Codeforces 1815E - Bosco and Particle

Codeforces 1815E - Bosco and Particle

时间:2023-04-29 20:33:27浏览次数:52  
标签:Particle int 光电 Codeforces ret 次数 MAXN Bosco MOD

首先,对于每个 \(s_i\),我们只用保留其最小周期,证明显然。

同时以多个光电门为研究对象显然状态数过多,不方便统计。考虑一下连接不同光电门的纽带是什么:显然是相邻光电门之间的空隙。对于每个光电门 \(i\),如果我们只保留 \(i\) 作为唯一的光电门,那么显然有 \(0\to 1\) 和 \(1\to 2\) 两个间隙,我们通过模拟求出在只保留这一个光电门的前提下 \(0\to 1\) 和 \(1\to 2\) 的次数 \(a_i,b_i\),那么我们惊奇地发现,在整个过程中,\(i-1\to i\) 的次数和 \(i\to i+1\) 的次数之比就是 \(a_i:b_i\)。

我们假设 \(i\to i+1\) 的经过次数为 \(f_i\),那么形式化地说,就是 \(\forall i\in[1,n],\exists k_i,s.t.f_{i-1}=a_ik_i,f_{i}=b_ik_i\),直接暴力对于每个质数求出这个质数在 \(f_0\) 中出现次数的最小值,然后乘起来就得到最小周期中的 \(f_0\) 了。这样就能求出完整的 \(f\) 数组,答案即为 \(2\sum f_i\)。

const int MAXN=2e6;
const int MOD=998244353;
int qpow(int x,int e){int ret=1;for(;e;e>>=1,x=1ll*x*x%MOD)if(e&1)ret=1ll*ret*x%MOD;return ret;}
int n,a[MAXN+5],b[MAXN+5],kmp[MAXN+5];char buf[MAXN+5];
int pr[MAXN+5],prcnt,vis[MAXN+5],mnp[MAXN+5];
void sieve(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i])pr[++prcnt]=i,mnp[i]=i;
		for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
			vis[pr[j]*i]=1;mnp[i*pr[j]]=pr[j];
			if(i%pr[j]==0)break;
		}
	}
}
vector<pii>vec[MAXN+5];
int prd=1;
int main(){
	scanf("%d",&n);sieve(MAXN);
	for(int i=1;i<=n;i++){
		scanf("%s",buf+1);int len=strlen(buf+1);
		for(int j=1;j<=len;j++)kmp[j]=0;
		for(int j=2,k=0;j<=len;j++){
			while(k&&buf[j]!=buf[k+1])k=kmp[k];
			if(buf[j]==buf[k+1])++k;kmp[j]=k;
		}
		int nl=((len%(len-kmp[len])==0)?(len-kmp[len]):len),cur=0,dir=1,pt=1;
		do{
			if((cur==0&&dir==-1)||(cur==2&&dir==1))dir=-dir;
			if(dir==1)((!cur)?a[i]:b[i])++;
			cur+=dir;
			if(cur==1){
				if(buf[pt]=='1')dir=-dir;
				pt=pt%nl+1;
			}
		}while(cur!=0||pt!=1);
//		printf("! %d %d\n",a[i],b[i]);
	}
	int lim=n;
	for(int i=1;i<=n;i++)if(!b[i]){lim=i-1;break;}
	for(int i=1;i<=lim;i++){
		int tmp=b[i];
		while(tmp!=1){
			int p=mnp[tmp],cnt=0;
			while(tmp%p==0)tmp/=p,cnt++;
			vec[p].pb(mp(cnt,1));
		}
		tmp=a[i];
		while(tmp!=1){
			int p=mnp[tmp],cnt=0;
			while(tmp%p==0)tmp/=p,cnt++;
			vec[p].pb(mp(-cnt,1));
		}
		tmp=b[i];
		while(tmp!=1){
			int p=mnp[tmp],cnt=0;
			while(tmp%p==0)tmp/=p,cnt++;
			vec[p].pb(mp(cnt,2));
		}
	}
	for(int i=1;i<=prcnt;i++){
		int mx=0,cur=0;
		for(pii p:vec[pr[i]]){
			if(p.se==1)cur+=p.fi,chkmax(mx,-cur);
			else chkmax(mx,p.fi-cur);
		}
		prd=1ll*prd*qpow(pr[i],mx)%MOD;
	}
	int sum=prd;
	for(int i=1;i<=lim;i++){
		prd=1ll*prd*qpow(a[i],MOD-2)%MOD*b[i]%MOD;
		sum=(sum+prd)%MOD;
	}printf("%d\n",2*sum%MOD);
	return 0;
}

标签:Particle,int,光电,Codeforces,ret,次数,MAXN,Bosco,MOD
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1815E.html

相关文章

  • Educational Codeforces Round 1
    A.TrickySum公式求出1到n的和,然后枚举二等整次幂。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn;cin>>n;intsum=(1+n)*n/2;for(inti=1;i<=n;i<<=1)sum-=i......
  • Educational Codeforces Round 145 (Rated for Div. 2)
    Preface补题A~D都能秒出,E没看出性质被薄纱了,F感觉是个丁真题随便讨论下就过了后面看了下F的标算是个倍增,感觉Tutorial对性质挖掘的还不够的说A.GarlandSB题,设出现次数最多的颜色个数为\(cm\),若\(cm\le2\)则答案为\(4\);若\(cm=3\)则答案为\(6\),若\(cm=4\)则无解importjav......
  • CodeForces-858#C 题解
    正文♦最坏时间复杂度:\(\mathcal{O}(\lvertS\rvert)\)本题十分简单,但请注意两个条件要同时满足。因为要求分割的次数越少越好,所以只要连续的辅音字母长度不大于2就不需要分割。由于辅音字母太多,只需要标记元音字母即可。#include<iostream>#include<string>#include<cst......
  • Codeforces Round 854 补题总结
    CodeforcesRound854补题总结前言昨天做这套题很不顺,今天补完题大概总结一下。总结RecentActions按题意模拟即可,考虑到前\(n\)个数一定始终在后\(m\)个数的前面,所以说当当前队列中如果没有出现\(x\)而在第\(i\)轮放进了\(x\),那么当前在队首的编号小于\(n\)的数......
  • Codeforces Round 868 Div 2
    A.A-characteristic(CF1823A)题目大意要求构造一个仅包含\(1\)和\(-1\)的长度为\(n\)的数组\(a\),使得存在\(k\)个下标对\((i,j),i<j\)满足\(a_i\timesa_j=1\)。解题思路当有\(x\)个\(1\),\(y\)个\(-1\)时,其满足条件的下标对数量为\(\frac{x(x-1)}{2}......
  • Codeforces Round 868 (Div. 2)
    Preface恭迎废物hl666终于回到了他忠诚的蓝名之位本来这场25min切完前三题而且没挂的时候感觉状态不错的,然后D被自己的一个假做法坑了1h最后ztc想出了大概的构造方法后已经来不及写了,一些细节没考虑好直接爆炸本来当时就有弃D开E的想法的,但可以E的题意在公告出来之前就已经读......
  • Codeforces Round 868 (Div. 2) A-E题解
    比赛地址这把真不在状态,麻了,看来还得再练A.A-characteristic题意:给出n和k,要求构造只含1和-1数组a,存在k对(i,j)(i≠j),有a[i]*a[j]=1Solution令构造的数组有x个1和y个-1,那么其对于答案的贡献有\[x*(x-1)/2+y*(y-1)/2\]又因为有x+y=n,所以可以转化成关于x的一元二次方程化简后......
  • Codeforces Round 867 (Div. 3)(A~D)
    目录A.TubeTubeFeed题意思路代码B.KarinaandArray题意思路代码C.BunLover题意思路代码D.Super-Permutation题意思路代码A.TubeTubeFeed题意给定时间\(t\),每个视频有一个价值\(b_i\),观看一个视频需要\(a_i\)秒,跳过一个视频需要花费\(1s\),求能观看完的价值最大......
  • Codeforces Round 867 (Div. 3)
    CodeforcesRound867(Div.3)A-TubeTubeFeed#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;typedefpair<string,int>PSI;constintN=50+5,INF=0x3f3f3f3f,Mod=1e6;constdoubleeps=1e-6;typedeflonglongll;......
  • Codeforces Round 866 (Div. 1) C. The Fox and the Complete Tree Traversal (构造)
    传送门题目大意:  给定一个有n个点的树,我们可以任意选择一个点作为起点,这个点可以跳到跟自己距离为1或者距离为2的点,已经到达的点不能再到达(最终必须回到起点),询问是否存在一种方案可以从一个点出发经过所有的点最终再回到这个点来。  输入一个整数n。紧接着输入n-1条边。大......