1.1 Discription
小畅和阿尼巴是好朋友。
如果你赶着 AK,请手动跳至最后一行
阿尼巴特别喜欢质数。
他认为质数就是有智慧的数,如果经常玩质数的话一定会变得像小畅
一样充满智慧。
然而这次他在玩一个数的时候,不小心把它给玩散了
这个数散落得满地都是,以至于喜欢跳舞的小畅都没有地方跳街舞了!!!
小畅十分气愤,恰好他知道阿尼巴喜欢质数
于是就想出一道质数的题目来气气他
“今天,我是作为一个长者在这里跟你讲话的。毕竟你啊,too young,
too simple, sometimes naive。你以为玩质数就可以变得像我一样满腹
智慧吗?想变的有智慧,先让我作为数论王者来考考你。怕你自卑,就
不考你多项式 exp,ln,sqrt, 求逆那种稍微小学一点的内容了。设 f (i) 为
i 的不同的质因子的个数。一个数 i 它散落在地上的方案就是 2 f (i) ,你
啊现在给我求出 1 − n 所有数散落在地上的方案和。不然,既然不让我
跳舞, 就不得不好好惩罚你了呢”
咳咳,说人话,就是让你求$sum_{i=1}^{n}2^{f(i)}$,其中 f (i) 表示 i 的不同的质因子的个数
答案对 998244353 取模
Input format
第一行一个正整数 n
Output format
输出一行,表示答案
Sample Input
2
Sample Input
3
Hint
20% 的数据满足 n ≤ 10^6
100% 的数据满足 1 ≤ n ≤ 10^12
首先$2^{f(x)}$可以看作把x的质因数分配给$i$和$j$,显然$gcd(i,j)=1$
所以$sum_{i=1}^{n}sum_{d|i}[gcd(d,frac{i}{d})=1]$
$sum_{i=1}^{n}sum_{d|i}sum_{p|d wedge p|frac{i}{d}}mu(p)$
$g(i)$表示$i$的约数个数
$sum_{i=1}^{n}sum_{p^2|i}g(frac{i}{p^2})mu(p)$
$sum_{p=1}^{sqrt(n)}mu(p)sum_{i=1}^{frac{n}{p^2}}g(i)$
$sum_{i=1}^{frac{n}{p^2}}g(i)=sum_{i=1}^{frac{n}{p^2}}sum_{d|i}1$
交换一下变成$sum_{p=1}^{sqrt(n)}mu(p)sum_{i=1}^{frac{n}{p^2}}[frac{n}{p^2*d}]$
然后枚举p套一个数论分块就可以了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long lol; 8 lol mu[1000001],n,lim,ans,Mod=998244353,pri[10000001],tot; 9 bool vis[10000001]; 10 lol query(lol x) 11 {lol pos,i; 12 lol sum=0; 13 for (i=1;i<=x;i=pos+1) 14 { 15 pos=x/(x/i); 16 sum+=(pos-i+1)*(x/i)%Mod;sum%=Mod; 17 } 18 return sum; 19 } 20 int main() 21 {lol i,j; 22 cin>>n; 23 lim=sqrt(n); 24 mu[1]=1; 25 for (i=2;i<=lim;i++) 26 { 27 if (vis[i]==0) 28 { 29 pri[++tot]=i; 30 mu[i]=-1; 31 } 32 for (j=1;j<=tot;j++) 33 { 34 if (1ll*i*pri[j]>lim) break; 35 vis[i*pri[j]]=1; 36 if (i%pri[j]==0) 37 break; 38 else mu[i*pri[j]]=-mu[i]; 39 } 40 } 41 for (i=1;i<=lim;i++) 42 { 43 ans+=mu[i]*query(n/(i*i)); 44 ans=(ans+Mod)%Mod; 45 } 46 cout<<ans; 47 }