首页 > 其他分享 >CF1815E Bosco and Particle

CF1815E Bosco and Particle

时间:2023-06-24 17:35:53浏览次数:25  
标签:Bosco Particle int ch num maxn now CF1815E mod

有个粒子初始在 \(0\) 位置,\(1\cdots n\) 位置分别为有一个对撞器,如果在 \(0\) 位置则向右,如果在 \(n + 1\) 位置则向左。每个对撞器有一个 \(01\) 串,初始所有对撞器的指针都在开头,当粒子走到 \(i\) 位置时,对撞器所指的值为 \(0\) 则不改变方向,否则反向,指针指向下一个位置,如果在串的末尾则指向开头。求最小的周期长度 \(c\) 满足任意 \(t\) 时间和 \(t + c\) 时间粒子在同一位置。

\(1\le n \le 10^6\),\(\sum |s_i|\le 10^6\)。


注意到对于一个位置,无论在右边转了多久,回到这里后和直接从右边回来是一样。左边同理。所以我们只用考虑 \(0,1,2\) 这三个位置。

还有一个显然的事实是每个粒子只用保留它的最小整周期,然后你就可以跑一个暴力,求出一个周期从左边进入 \(a_i\) 次,往右边走出去 \(b_i\) 次。显然这个过程是对称的。

设 \(f_i\) 代表最后过程中 \(i\to {i+1}\) 的次数,由于左边和右边会右七七八八的破事,所以 \(i\) 这个位置可能进进出出多个周期,所以应该 \(\frac{f_i}{f_{i+1}}=\frac{a_i}{b_i}\)。使用主元法,用 \(f_0\) 表示出所有 \(f_i=f_0\prod_{j=1}^{i}\frac{b_j}{a_j}\)。我们需要构造这个 \(f_0\) 使得每一个 \(f_i\) 是整数,并且 \(b_i\mid f_i\)。根据每个质因子考虑,随时把不够的部分补进 \(f_0\) 里。不妨设 \(b_n\not=0\),统计这一部分即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5, mod = 998244353;
int qmod(int x) { return x >= mod ? x - mod : x; }
int ksm(int a, int b = mod - 2) 
{
	int ret = 1;
	for (; b; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ret = 1ll * ret * a % mod;
	return ret;
}
template <typename T>
void read(T &x)
{
	T sgn = 1;
	char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
	for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
	x *= sgn;
}
int n, prime[maxn], cnt, mn[maxn];
bool vis[maxn];
char s[maxn];
int nxt[maxn], a[maxn], b[maxn];
int mx[maxn], num[maxn];
void sieve(int mx)
{
	for (int i = 2; i <= mx; i++)
	{
		if (!vis[i]) prime[++cnt] = i, mn[i] = i;
		for (int j = 1; j <= cnt && prime[j] * i <= mx; j++)
		{
			vis[i * prime[j]] = 1;
			mn[i * prime[j]] = prime[j];
			if (i % prime[j] == 0) break;
		}
	}
}
int main()
{
	read(n); sieve(1000000);
	for (int _ = 1; _ <= n; _++)
	{
		scanf("%s", s + 1);
		int len = strlen(s + 1);
		for (int i = 2, j = 0; i <= len; i++)
		{
			while (j && s[i] != s[j + 1]) j = nxt[j];
			if (s[i] == s[j + 1]) j++;
			nxt[i] = j;
		}
		int per = len % (len - nxt[len]) == 0 ? len - nxt[len] : len;
		int cur = 0, dir = 1, pos = 1;
		do
		{
			cur += dir;
			if (cur == 1)
			{
				dir == 1 ? a[_]++ : b[_]++;
				if (s[pos] == '1') dir = -dir;
				pos = pos % per + 1;
			}
			else dir = cur == 0 ? 1 : -1;
		} while (cur != 0 || pos != 1);
// 		if (n == 50)
// 			printf("! %d %d\n", a[_], b[_]);
	}
	for (int i = 1; i <= n; i++)
	{
		int now = a[i];
		while (now > 1)
		{
			int p = mn[now];
			while (now % p == 0) now /= p, num[p]--;
			mx[p] += max(0, -num[p]);
			num[p] = max(num[p], 0);
		}
		if (!b[i]) break;
		now = b[i];
		while (now > 1)
		{
			int p = mn[now];
			while (now % p == 0) now /= p, num[p]++;
			mx[p] = max(mx[p], -num[p]);
		}
	}
	int f0 = 1;
	for (int i = 1; i <= cnt; i++) f0 = 1ll * f0 * ksm(prime[i], mx[prime[i]]) % mod;
	int ans = f0;
	for (int i = 1; i <= n; i++)
	{
		f0 = 1ll * f0 * b[i] % mod * ksm(a[i]) % mod;
		ans = qmod(ans + f0);
	} printf("%d\n", qmod(ans + ans));
	return 0;
}

标签:Bosco,Particle,int,ch,num,maxn,now,CF1815E,mod
From: https://www.cnblogs.com/zcr-blog/p/17501356.html

相关文章

  • 基于粒子群的PMU优化配置,是一个使用粒子群优化算法(Particle Swarm Optimization, PSO
    基于粒子群的PMU优化配置软件:MATLAB介绍:电力系统PMU优化配置,为了使电力系统达到完全可观,以PMU配置数量最少为目标函数,运用粒子群算法进行优化处理,在IEEE303957118系统进行仿真验证。这段代码是一个使用粒子群优化算法(ParticleSwarmOptimization,PSO)来解决IEEE39节点电力......
  • 「解题报告」CF1815E Bosco and Particle
    好像不难。但是没想到。首先这玩意看起来就得拆开,要不然完全做不了。假如我们只考虑某一个点\(i\),考虑\(i-1\toi,i\toi+1\)这两条边的经过次数,不难发现其它的点是不会影响这两条边的。那么我们可以直接依据题意模拟,只考虑这一个点的周期是多长,然后所有的周期\(\mat......
  • The Importance of Particle Size Analysis in Preformulation Studies
    Thesizeoftheparticlesiscalledparticlesize.TheparticlesizeoftheAPIiscloselyrelatedtothehomogeneityofthepreparationprocessintermsofmixing,theaccuracyofdosage,andcompressibility,andithasanimpactonthesolubility,durat......
  • Real-Time Water Waves With Wave Particles - cem yuksel - 2010
    摘要:Thisdissertationdescribesthewaveparticlestechniqueforsimulatingwatersurfacewavesandtwowayfluid-objectinteractionsforreal-timeapplications,suchasvideogames.本文描述了用于模拟水面波的波粒子技术和用于视频游戏等实时应用的双向流体-物体......
  • Wave Particles(波动粒子) - Cem Yuksel
    参考:http://www.cemyuksel.com/research/waveparticles/Thisiscapturedfromourreal-timesimulation,showingthreeboatsintheopenocean.Thedynamicsurfacewavesgeneratedduetoboatmotionaresimulatedusingwaveparticles.Inaddition,boatmotion......
  • Codeforces 1815E - Bosco and Particle
    首先,对于每个\(s_i\),我们只用保留其最小周期,证明显然。同时以多个光电门为研究对象显然状态数过多,不方便统计。考虑一下连接不同光电门的纽带是什么:显然是相邻光电门之间的空隙。对于每个光电门\(i\),如果我们只保留\(i\)作为唯一的光电门,那么显然有\(0\to1\)和\(1\to2\)......
  • js 粒子点击鼠标(particle)
    直接贴js代码在script里面就行了constparticle_canvas=document.createElement("canvas");particle_canvas.setAttribute("id","particle_canvas")document.querySel......
  • PHP轻量级验证器 Particle\Validator
    Particle\Validator是一个小巧优雅的实用的PHP验证类库,提供了一个非常简洁的API。它无需依赖其他组件,提供友好的文档,并且有利于扩展。composerrequireparticle/validat......
  • 粒子系统动力学 Particle System Dynamics
    1.介绍粒子是具有质量、位置和速度并对力作出反应但没有空间范围的物体。因为它们很简单,所以粒子是迄今为止最容易模拟的对象。尽管粒子很简单,但可以表现出广泛的有趣行......
  • "蔚来杯"2022牛客暑期多校训练营4 N-Particle Arts
    问题描述InaconfinedNIOspace,therearennnNIOparticles,theiii-thofwhichhasaia_iai​jouleenergy.TheNIOparticlesareveryspecialastheykeep......