ABC212G

发布时间 2023-04-07 14:04:23作者: Nasturity

ABC 212 G

直接做不好做,考虑将 \(x,y\) 替换成某个幂的形式来试图去掉底数。

\(g\)\(P\) 的原根,那么 \(x,y\) 一定可以表示成 \(g\) 的某个在模意义下的幂,不妨设 \(x \equiv g^{i} (\bmod P),y \equiv x^{j}(\bmod P)\)

那么原限制就变为了 \(g^{i \times n} \equiv g^{j} (\bmod P)\)。显然等价于 \(i \times n \equiv j (\bmod P-1)\),这个由原根的定义可以得到。

答案即为

\[\sum\limits_{i=0}^P \sum\limits_{j=0}^P [\exists n,i \times n \equiv j (\bmod P-1)] \]

右边的式子又等价于询问 \(i \times n + (P-1) \times m =j\) 这个方程是否有正整数解。由裴蜀定理我们知道只有当 \(\gcd(i,P-1) | j\) 的时候存在正整数解。

由于 \(i=0,j=0\) 的情况较为特殊,将他提出来单独写。

\[\sum\limits_{i=1}^P \sum\limits_{j=1}^P [\gcd(i,P-1) | j] +1 \]

也就是

\[\sum\limits_{i=1}^{P-1} \frac{P-1}{\gcd(i,P-1)} + 1 \]

考虑枚举 \(\gcd(i,P-1)\)

\[\sum\limits_{d=1}^{P-1} \lfloor \frac{P-1}{d} \rfloor \sum\limits_{i=1}^{\large \lfloor \frac{P-1}{d}\rfloor} [\gcd(i,\lfloor \frac{P-1}{d} \rfloor)=1] \]

等价于

\[\sum\limits_{d=1}^{P-1} \lfloor \frac{P-1}{d} \rfloor \phi(\lfloor \frac{P-1}{d} \rfloor) \]

我一开始化简到这里就开始无脑杜教筛了,但是后面发现只有当 \(d | P-1\) 的时候答案才有效,所以直接暴力计算即可。只要好好写 \(\phi\) 就是可以过的。

注意 \(\phi(i)\) 是有可能 \(\ge mod\) 的,取模的时候要注意。

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define vi vector<int>
#define pb(x) push_back(x)
#define pii pair<int,int>
#define lowbit(x) x&-x
using namespace std;
const int mod=998244353;
ll ans;
int n,m,T;
inline int read(){
	int s=0,f=0;
	char ch=getchar();
	while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
	while(ch<='9'&&ch>='0') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return f?-s:s;
}
inline int phi(int x){
	int res=x;
	for(register int i=2;i*i<=x;++i){
		if(x%i==0){
			while(x%i==0) x/=i;
			res=res/i*(i-1);
		}
	}
	if(x>1) res=res/x*(x-1);
	return res%mod;
}
signed main(){
	n=read()-1;
	for(register int i=1;i*i<=n;++i){
		if(n%i) continue;
		ans=(ans+i*phi(i)%mod)%mod;
		if(i*i!=n) ans=(ans+(n/i%mod)*phi(n/i)%mod)%mod;
	}
	cout<<ans+1;
	return 0;
}