首页 > 其他分享 >hdu7319 String and GCD

hdu7319 String and GCD

时间:2023-07-30 20:00:33浏览次数:47  
标签:String int hdu7319 while tot GCD ans include fo

String and GCD

首先我们需要用kmp的fail建树,然后需要利用到欧拉反演。

\[n=\sum_{d|n} \varphi(d) \]

对于这题来说

\[(i,j)=\sum_{d|(i,j)} \varphi(d)=\sum_{d|i,d|j} \varphi(d) \]

那么我们只需要用一个桶存每个约数从根到当前节点出现了多少次。
然后枚举约数也有一个技巧,具体看代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
#include<vector>
#define fo(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
using namespace std;
typedef long long ll;
const int N=1e6+5;
const ll mo=998244353;
bool vis[N];
int p[N],t[N],f[N],m[N],cnt,g[N];
int to[N],nex[N],head[N],tot,l,r;
char s[N];
int n,j,z;
ll ans;
vector<int> e;
void add(int x,int y){
	to[++tot]=y; nex[tot]=head[x]; head[x]=tot;
}
void work(int x){
	e.clear();
	e.push_back(1);
	while (x!=1){
		z=m[x];
		
		l=0; r=e.size();
		while (x%z==0) {
			x/=z;
			fo(i,l,r-1) e.push_back(e[i]*z);
			l=r; r=e.size();
		}
	}
}
void dfs(int x){
	f[x]=0;
	work(x);
	for (int i=0;i<(int)e.size();i++) {
		f[x]=(f[x]+g[e[i]]*t[e[i]]%mo )%mo;
		t[e[i]]++;
	}
	
	for (int i=head[x];i;i=nex[i]){
		int v=to[i];
		dfs(v);
	}
	
	work(x);
	for (int i=0;i<(int)e.size();i++) {
		t[e[i]]--;
	}
}
int main(){
//	freopen("data.in","r",stdin);

	int size(512<<20); // 512M
	__asm__ ( "movq %0, %%rsp\n"::"r"((char*)malloc(size)+size));
	
	g[1]=1;
	fo(i,2,1e6){
		if (!vis[i]) {
			p[++cnt]=i;
			g[i]=i-1;
			m[i]=i;
		}
		fo(j,1,cnt) {
			if ((ll)i*(ll)p[j]> 1e6) break;
			vis[i*p[j]]=1;
			m[i*p[j]]=p[j];
			
			if (i%p[j]==0) {
				g[i*p[j]]=g[i]*p[j];
				break;
			}
			else{
				g[i*p[j]]=g[i]*(p[j]-1);
			}
		}
	}
	
	int T;
	scanf("%d",&T);
	while (T--){
		scanf("%s",s+1);
		n=strlen(s+1);
		
		memset(head,0,sizeof(head));
		memset(p,0,sizeof(p));
		tot=0;
		memset(f,0,sizeof(f));
		
		p[1]=0; j=0;
		fo(i,2,n) {
			while (j && s[j+1]!=s[i]) j=p[j];
			if (s[j+1]==s[i]) j++;
			p[i]=j;
			add(j,i);
		}
		
		fo(i,1,n) if (!p[i]) dfs(i);
		ans=1;
		fo(i,1,n) {
			ans=ans*(f[i]+1)%mo;
//			printf("%d\n",f[i]);
		}	
		printf("%lld\n",ans);
		
	}	
	
	exit(0);
}

标签:String,int,hdu7319,while,tot,GCD,ans,include,fo
From: https://www.cnblogs.com/ganking/p/17591906.html

相关文章

  • CF1849C Binary String Copying
    Link我们想一下,什么时候两种变换是相同的或者说,这意味着什么。本题目有特殊性,特殊性就在于只有0和1对于每一个被改变的区间\([L_i,r_I]\),从\(l_i\)开始的那一堆0,和从\(r_i\)开始的那一堆1都没变。所以变化的部分就要从从左往右第一个1,和从右往左第一个0开始算。这个东西可以......
  • 【模板】数论基础:exGCD,exCRT,inverse,Lucas,BSGS,primitive root
    7.29数论WIP\(a\equivb\pmodp\Rightarrow\frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{p}{d}},d=\gcd(a,b,p)\)。exGCD若\((a,b)=1\),则\(0\leqx<b\),\(ax\bmodb\)互不相同,有一个是\(1\)。证明:\(ax_1\equivax_2\pmodb\)则\((x_1-x_2)a|b\),因为......
  • String(续)
    一、String类表示字符串的类,其中定义了很多操作字符串的方法二、StringBuilder一个可变的操作字符串的容器可以高效地拼接字符串,还可以将容器中的内容反转三、StringJoiner可以高效、方便的拼接字符串用到的参数:(间隔符号,开始符号,结束符号)(间隔符号)......
  • JSON.toJSONString将key变成了首字母小写的问题
    在一些请求接口传参时,往往需要把请求参数转为JSON字符串,但JSON.toJSONString会默认将key的首字母变小写的问题importlombok.Data;@Datapublicclasstest{privateLongId;}Testparams=newTest();params.setId(11);JSON.toJSONString(params);System.out.pri......
  • 能在 Switch 中使用 String 吗?
    从Java7开始,我们可以在switchcase中使用字符串,但这仅仅是一个语法糖。内部实现在switch中使用字符串的hashcode。   在Java7中,switch开始支持String类型。 从本质来讲,switch对字符串的支持,其实是int类型值得匹配。 其实现原理为:通过对case后面的String对......
  • String转Map java
    String转Mapjava实现步骤1.理解需求在开始编写代码之前,我们需要明确我们的需求是什么。在这个任务中,我们需要将一个字符串转换为一个Java中的Map对象。字符串的格式可能是键值对的形式,比如"key1=value1;key2=value2",我们需要将其转变为一个Map对象,其中键是字符串中的键名,而值是......
  • String mobleCode = redisTemplate.opsForValue().get(phone);
    使用RedisTemplate获取手机验证码在现代的应用程序中,手机验证码被广泛用于用户身份验证和安全验证。使用手机验证码可以确保用户提供的手机号是有效的,并且可以防止恶意行为。在本文中,我们将介绍如何使用SpringDataRedis中的RedisTemplate来获取手机验证码。RedisTemplate简介R......
  • C# string.format格式说明
    stringstr1=string.Format("{0:N1}",56789);//result:56,789.0stringstr2=string.Format("{0:N2}",56789);//result:56,789.00stringstr3=string.Format("{0:N3}",56789);//result:56,78......
  • java string判断包含字符个数
    JavaString判断包含字符个数在Java中,要判断一个字符串中包含特定字符的个数,我们可以使用以下步骤来实现。流程概述步骤描述步骤1提示用户输入字符串步骤2提示用户输入要判断的字符步骤3使用循环遍历字符串的每个字符步骤4判断当前字符是否与要判断的字符......
  • java queryStringQuery
    了解Java中的queryStringQuery在Java编程中,我们经常需要通过搜索功能来查询和过滤数据。Elasticsearch是一个流行的搜索引擎,它提供了强大的全文搜索功能。在Elasticsearch中,我们可以使用queryStringQuery来执行基于字符串的查询。queryStringQuery是什么?queryStringQuery是Elast......