ABC304F Shift Table

news/2024/7/7 18:58:09

ABC304F Shift Table

题目大意

T T T和小 A A A要做 n n n天的工作。

T T T的工作表表示为字符串 S S S,其中“#”表示当天要工作,“.”表示当天不需要工作。

你需要安排小 A A A的工作,步骤如下

  • 选择一个 n n n的约数 m m m m ≠ n m\neq n m=n
  • 决定这 m m m天的工作安排
  • 对于 i = 1 , 2 , … , n − m i=1,2,\dots,n-m i=1,2,,nm,第 i + m i+m i+m天的工作安排和第 i i i天的相同

求小 A A A有多少种工作安排,使得每一天都至少有一个人在工作?

输出答案模 998244353 998244353 998244353后的值。

2 ≤ n ≤ 1 0 5 2\leq n\leq 10^5 2n105


题解

首先,枚举 n n n的约数,即 m m m的值。然后,对于每一个为“.”的位置 i i i,小 A A A的这个位置都必须是“#”,所以小 A A A的所有 k × m + i k\times m+i k×m+i k ∈ Z k\in Z kZ)的位置都是“#”。用一个桶来存模 m m m后必须是“#”的位置,剩下的任意选。若有 t t t个数满足存在一个 i i i满足 i % m = t i\% m=t i%m=t,那剩下的可以选“#”或“.”,也就是说取当前这个 m m m值的满足题意的方案有 2 m − t 2^{m-t} 2mt个。

当然,这样算会算重,比如算 m = 2 a m=2a m=2a时有一部分是 m = a m=a m=a时算过的。那么,我们记 p t i pt_i pti表示 n n n的第 i i i个约数 p i p_i pi对答案的贡献,其中不包括 p i p_i pi的不等于 p i p_i pi的约数的贡献。那么,枚举 p i p_i pi的不等于 p i p_i pi的约数,用前面的 2 m − t 2^{m-t} 2mt减去对应的 p t pt pt值即可。

n n n的约数最多有 2 n 2\sqrt n 2n 个,所以时间复杂度为 O ( n n ) O(n\sqrt n) O(nn )

code

#include<bits/stdc++.h>
using namespace std;
int n,z[200005],p[200005],re[200005];
char s[100005];
long long ans=0,pt[200005];
const long long mod=998244353;
long long mi(long long t,long long v){
	if(!v) return 1;
	long long re=mi(t,v/2);
	re=re*re%mod;
	if(v&1) re=re*t%mod;
	return re;
}
int main()
{
	scanf("%d%s",&n,s+1);
	for(int i=1;i<n;i++){
		if(n%i==0){
			p[++p[0]]=i;
			re[i]=p[0];
		}
	}
	for(int i=1;i<=p[0];i++){
		for(int j=1;j<=n;j++){
			if(s[j]=='.') z[j%p[i]]=1;
		}
		int vt=p[i];
		for(int j=0;j<p[i];j++){
			if(z[j]){
				--vt;z[j]=0;
			}
		}
		pt[i]=mi(2,vt);
		for(int j=1;j<p[i];j++){
			if(p[i]%j==0){
				pt[i]=(pt[i]-pt[re[j]]+mod)%mod;
			}
		}
		ans=(ans+pt[i])%mod;
	}
	printf("%lld",ans);
	return 0;
}

http://lihuaxi.xjx100.cn/news/1207764.html

相关文章

JavaSE进阶(day13,复习自用)

单元测试、反射、注解、动态代理 单元测试单元测试概述单元测试快速入门单元测试常用注解 反射反射概述反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用-绕过编译阶段为集合添加数据反射的作用-通用框架的底层原理 注解注解概述自定义注解元注…

哈希Hash

HashMap是Java中常用的数据结构之一&#xff0c;它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍&#xff1a; 1. 数据结构&#xff1a;HashMap底层使用数组和链表&#xff08;或红黑树&#xff09;的组合实现。它通过哈希算法将键转换为数组索引&#…

【计算机组成原理·笔记】存储器概述

存储器概述 存储器分类 按存储介质分类 半导体存储器&#xff1a; TTL,MOS 小电源消失&#xff0c;信息丢失&#xff08;易失&#xff09; 磁表面存储器&#xff1a;硬盘磁芯存储器&#xff1a;光盘存储器&#xff1a; 按存取方式分类 存取方式与物理地址无关&#xff08;…

chatgpt赋能python:Python均值函数介绍

Python均值函数介绍 Python是一种高级编程语言&#xff0c;非常适合数据处理和分析。在数据分析中&#xff0c;均值通常被用来代表一组数据的平均水平。Python提供了多种方式来计算均值&#xff0c;其中最常用的是使用均值函数来计算。 什么是均值函数&#xff1f; 均值函数…

JS回调函数(callback)

在使用Jquery的时候&#xff0c;用到Callback()&#xff0c;回调函数的概念。并且不少。javascript 好比&#xff1a;html $.ajax({url:"test.json",type: "GET",data: {username:$("#username").val()},dataType: "json",beforSend…

包扫描工具实现(详解)

文章目录 前言包扫描实现思路&#xff08;需求分析&#xff09;&#xff1a; 具体实现完整代码 前言 注解在 Java 是一个非常重要的存在&#xff0c;而且它出现的非常频繁。 在一个工程下可能有许多的包或者Jar包&#xff0c;为了结合注解可以准确的定位到一个需要的类上&…

【期末复习之路】JAVA(三)B

接着上节&#xff0c;我们讲完了分支结构&#xff0c;我们的B部分准备讲循环结构&#xff0c;下文的重点请大家细细品味 文章目录 一 循环语句 二 for循环 三 while循环 四 do-while循环 五 对比三种循环结构 六 嵌套循环(或多重循环) 七 break和continue的使用 八 Sca…

MyBatis--2(基于MyBatis的增删改查)

一、准备 准备数据库表emp创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖(mybatis、mysql驱动、lombok)application.properties中引入数据库连接信息:数据库连接四要素创建对应的实体类Emp(实体类属性采用驼峰命名–不留下划线)准备Mapper接口EmpMapper 二、…