bzoj4173 数学
还是爆炸欧鸡的题难qwq
[φ(n)*φ(m)*sum_{kin S(n,m)}φ(k)~mod~p,p=998244353且S(n,m)={n~mod~k+m~mod~kge~k}\
打表都找出规律了555,写龟速乘写挂了,抱灵了,要不然就rank1了100pts->0\
因为n~\%~k=n-lfloor frac nk
floor*k\
S(n,m)等价于lfloorfrac{n+m}{k}
floor-lfloorfrac nk
floor-lfloorfrac mk
floor=1\
sumφ(k)[n\%k+m\%kge k]=sumφ(k)[lfloorfrac{n+m}{k}
floor-lfloorfrac nk
floor-lfloorfrac mk
floor=1]\
因为0lelfloorfrac{n+m}{k}
floor-(lfloorfrac nk
floor+lfloorfrac mk
floor)<2\
所以上式可以化成sum_{k=1}^{n+m}φ(k)(lfloorfrac{n+m}{k}
floor-lfloorfrac nk
floor-lfloorfrac mk
floor)\
=sum_{i=1}^{n+m}φ(k)lfloorfrac{n+m}{k}
floor-sum_{k=1}^nlfloorfrac nk
floorφ(k)-sum_{k=1}^mlfloorfrac mk
floorφ(k),这里开始没搞懂,因为枚举超过n和m时就取0了\
sum_{k=1}^nφ(k)*lfloorfrac nk
floor咋搞?通过sum_{k|n}φ(k)=n \
sum_{k=1}^nφ(k)*lfloorfrac nk
floor=sum_{i=1}^nsum_{k|i}φ(k)=sum_{i=1}^ni\
[1,n]中约数有k的个数是lfloorfrac nk
floor\
然后等差求和了原式就为φ(m)*φ(n)*mn
]
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long ll;
const int inf =0x3f3f3f3f;
const double eps=1e-8;
ll read()
{
ll res=0,f=1;
char ch=getchar();
while(ch<'1'||ch>'9'){f=ch=='-'?-1:1;ch=getchar();}
while(ch>'1'&&ch<'9'){res=res*10+ch-'0';ch=getchar();}
return res*f;
}
ll n,m;
ll phi(ll n)
{
ll i,re=n;
for(i=2;i*i<=n;i++){
if(n%i==0){
re=re/i*(i-1);
while(n%i==0){n/=i;}
}
}
if(n!=1){re=re/n*(n-1);}
return re;
}
int main()
{
scanf("%lld%lld",&n,&m);
printf("%lld
",phi(n)%mod*(phi(m)%mod)%mod*(n%mod)%mod*(m%mod)%mod);
return 0;
}
上图是windfreedom大佬的博客截下来的 写下出处
这题不用龟速乘qwq