首页 > 其他分享 >【题解】[ABC304F] Shift Table(容斥)

【题解】[ABC304F] Shift Table(容斥)

时间:2023-06-04 18:11:54浏览次数:55  
标签:Aoki int ch 出勤 题解 容斥 vis 因子 Table

【题解】[ABC304F] Shift Table

题目链接

ABC304F

题意概述

Takahashi 和 Aoki 将在接下来的 \(N\) 天里兼职工作。

Takahashi 这 \(n\) 天的出勤情况由字符串 \(S\) 表示,其中 \(S\) 的第 \(i\) 个字符是 # 则表示他在第 \(i\) 天工作,第 \(i\) 个字符是 . 表示他在第 \(i\) 天休息。

Aoki 的出勤情况如下:

  • 首先选择一个 \(N\) 的正因数 \(M\),其中 \(M\ne N\);
  • 接下来安排 \(1\) 到 \(M\) 天的出勤情况;
  • 最后安排 \(M+1\) 到 \(N\) 天的出勤情况,使得对于任意 \(i(1\le i \le M)\),第 \(kM+i\) 天的出勤情况与第 \(i\) 天一致。

注意:不同的 \(M\) 可能会形成相同的出勤情况安排。

求 Aoki 可能的出勤情况安排数量,使得 Takahashi 和 Aoki 至少在每一天都有一人工作。

答案对 \(998244353\) 取模。

数据范围

  • \(1\le N \le 10^5\)

题目分析

首先我们发现,\(10^5\) 范围内的数的因子数不超过 \(128\) 个。

那么很容易想到去枚举因子 ,考虑 \(N\) 的每个因子的贡献。

对于每个因子 \(M\),我们可以将 \(N\) 天平均分为 \(\dfrac{N}{M}\) 份,根据题目要求, 每一份的出勤安排相同。

由于必须保证两人至少在每一天都有一人工作,所以若第 \(i\) 天 Takahashi 休息,则 Aoki 在这一天必须出勤。同时,如果确定了第 \(i\) 天 Aoki 出勤,那么第 \(kM+i\) 天 Aoki 也必须出勤。换句话说,若第 \(i\) 天出勤,那么所有使得 \(j\bmod M=i \bmod M\) 的第 \(j\) 天也必须出勤。

基于此,我们可以定义一个 \(vis\) 数组,其中 \(vis_i\) 表示每一份的第 \(i\) 天是否必须出勤。枚举从 \(1\) 到 \(N\) 的每一天,若 \(S_i\) 为 .,则将 \(vis_{i\bmod M}\) 设为 \(1\)。

那么对于 \(vis_i=0\) 的 \(i\),既可以出勤又可以休息,也就是说第 \(i\) 天有两种情况。对于 \(vis_i=1\) 的 \(i\),必须出勤,只有一种情况。

所以对于每个因子 \(M\),如果 \(vis_i=0\) 的 \(i\) 的个数为 \(t\),符合题意的方案数就是 \(2^t\)。

观察样例可以发现,对于所有的 \(M\),答案并非是简单的所有 \(M\) 的方案数相加,因为不同的 \(M\) 可能会形成相同的出勤情况安排。

我们考虑什么样的 \(M\) 可以形成相同的出勤安排。容易发现,对于因子 \(M_i\) 和 \(M_j\),若 \(M_i\) 是 \(M_j\) 的倍数,则 \(M_i\) 的方案数完全包含 \(M_j\) 的方案数。那么为了避免重复计数,我们应该将 \(M_i\) 的方案数减去 \(M_j\) 的方案数计入总答案。

所以我们可以对于每一个因子 \(M\) 的方案数,减去所有 \(N\) 的因子中同时也是 \(M\) 的因子的方案数,即为 \(M\) 单独对答案的贡献。

最后,所有的因子贡献之和即为答案。

时间复杂度 \(O(128N)\)。

代码实现

//F
//The Way to The Terminal Station…
#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#define int long long
using namespace std;
const int maxn=1e5+10;
const int mod=998244353;
set<int>p,q;
int vis[maxn],sum[maxn];//vis[i] 表示的是每一份的第 i 天是否必须出勤,sum[i] 表示的是因子 i 的贡献。

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

signed main()
{
	int n=read();
	string s;
	cin>>s;
	s='%'+s;
	//预处理出 n 的所有因子
	for(int i=1;i<n;i++)
	{
		if(n%i==0)p.insert(i);
	}
	//枚举所有的因子,考虑每个因子的贡献。
	int ans=0;
	for(int v:p)
	{
		for(int i=1;i<=v;i++)vis[i]=0;
		for(int i=1;i<=n;i++)
		{
			int t=i%v;
			if(t==0)t=v;
			if(s[i]=='.')vis[t]=1;
		}
		sum[v]=1;
		for(int i=1;i<=v;i++)
		{
			if(!vis[i])(sum[v]*=2)%=mod;
		}
        //容斥,计算每个因子单独的贡献。
		for(int vv:p)
		{
			if(vv==v)break;
			if(v%vv==0)sum[v]=(sum[v]-sum[vv]+mod)%mod;
		}
		(ans+=sum[v])%=mod;
	}
	cout<<ans<<'\n';
	return 0;
}

标签:Aoki,int,ch,出勤,题解,容斥,vis,因子,Table
From: https://www.cnblogs.com/xrkforces/p/ABC304F.html

相关文章

  • table合并单元格 colspan(跨列)和rowspan(跨行)
    colspan和rowspan这两个属性用于创建特殊的表格。[color=red][b]colspan[/b]是“columnspan(跨列)”的缩写。colspan属性用在td标签中,用来指定单元格横向跨越的列数[/color]:在浏览器中将显示如下:[img][/img]该例通过把colspan设为“3”,令所在单元格横跨了三列。如果我们将cols......
  • 题解:【AGC054D】 (ox)
    题目链接Larry76牛牛首先考虑没有ox怎么做,就是将括号序列调成合法。\(|S|\)不大直接模拟一遍,记录\(now\)表示一个前缀权值,当遇到一个(时\(+1\),遇到一个)时\(-1\),当\(now<0\)的时候说明序列不合法即)多了,暴力向后找到第一个(交换到当前的)前面。这样我们......
  • A卡在ubuntu下部署stable-diffusion-webui
    因为自己之前为了装黑苹果把1080ti卖了买了6800XT,在现在这个玩AI的时代后悔莫及,先尝试在macm1下安装了stable-diffusion-webui,功能基本上都能用,就是速度太慢。后来想了想还是装了ubuntu,组成win+mac+ubuntu的三系统1.安装ubuntu安装ubuntu基本都有教程,使用UEFI安装好之后在启......
  • Codeforces Round 876 (Div. 2)题解
    CodeforcesRound876(Div.2)A.TheGoodArray标签greedymath题意对于任意\(i\in\{1,2,\dots,n\}\),要求数列\(a\)满足前\(i\)个元素中至少有\(\lceil\frac{i}{k}\rceil\)个元素为\(1\),后\(i\)个元素中至少有\(\lceil\frac{i}{k}\rceil\)个元素为\(1\)。思......
  • “AIR SDK 0.0: AIR SDK location “...\devsdks\AIRSDK\Win” does not exist.”
    导入AS3项目时提示“AIRSDK0.0:AIRSDKlocation“D:\ProgramFiles\Adob5eFlashBuilder4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win”doesnotexist.”是AS3项目找不见AIRSDK.打开项目配置ActionScriptBuildPath,路径出错......
  • Flink Table Store 独立孵化启动 ,Apache Paimon 诞生
    2023年3月12日,FlinkTableStore项目顺利通过投票,正式进入Apache软件基金会(ASF)的孵化器,改名为ApachePaimon(incubating)。随着ApacheFlink技术社区的不断成熟和发展,越来越多企业开始利用Flink进行流式数据处理,从而提升数据时效性价值,获取业务实时化效果。与此......
  • table.bootstrapTable() 之基本使用方法
    一、Html表格table属性设置如下 data-toggle="table"data-url="Url地址"data-pagination="true"data-search="true"data-show-columns="true"data-show-refresh="true"data-show-toggle="true"data-page-......
  • CF1329E Dreamoon Loves AA 题解
    令\(p_0=0,m\leftarrowm+1,p_{m}=n,a_i=p_i-p_{i-1}\),设在\((p_{i-1},p_i)\)中有\(d_i-1\)个B变成了A,满足\(\sum_{i=1}^m(d_i-1)=k\),让\(k\leftarrowk+m\),这样\(d\)需要满足的限制就变成了\(\sum_{i=1}^md_i=k\)。这也可以看作把\(a_i\)分成\(d_i\)个正整数之......
  • ABC302Ex Ball Collector 题解
    注意到当有那些\((a_i,b_i)\)是确定的时,答案就是将\((a_i,b_i)\)连边后每个连通块的\(\min(|V|,|E|)\)之和。那么这个东西用可撤销并查集维护即可。#include<algorithm>#include<cstdio>usingnamespacestd;constintN=2e5;structEdge{intto,nxt;}e[......
  • MySQL 8错误日志出现"The table /home/work/mysql_3306/tmp/#sqla2b_298b06_4d is fu
    ##############    了解MySQL8.0.26的错误日志出现"Thetable /home/work/mysql_3306/tmp/#sqla2b_298b06_4disfu11!"的bug,暂时通过修改临时表的存储引擎为内存引擎解决  MySQL8.0.13开始引入新的临时内存表引擎TempTable,并将其作为内存中创建临时表的默认存储引擎。T......