懒得写
[n mod k+m mod k≥k]=[n−⌊nk⌋k+m−⌊mk⌋k>=k] 于是等价于 [⌊n+mk⌋−⌊nk⌋−⌊mk⌋>=1] 注意这个式子的值也只可能是0或1,因此可以写成 ⌊n+mk⌋−⌊nk⌋−⌊mk⌋ 代入原式 ∑n+mk=1(⌊n+mk⌋−⌊nk⌋−⌊mk⌋)ϕ(k) 展开来 ∑n+mk=1⌊n+mk⌋ϕ(k)−∑nk=1⌊nk⌋ϕ(k)−∑mk=1⌊mk⌋phi(k) 注意到 ∑ni=1⌊ni⌋ϕ(i)=∑ni=1∑d|iϕ(d)=∑ni=1i 于是你就奥妙重重的发现刚刚那条式子等于nm。 至于前面那个phi(n)和phi(m)随便求一下。
#include<cstdio> #include<algorithm> #include<cmath> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int mo=998244353; ll i,j; ll n,m,l,k,t,ans; int main(){ scanf("%lld%lld",&n,&m); ans=(n%mo)*(m%mo)%mo; k=l=n; t=floor(sqrt(n)); fo(i,2,t){ if (k%i==0){ l=l/i*(i-1); while (k%i==0) k/=i; } } if (k>1) l=l/k*(k-1); ans=ans*(l%mo)%mo; k=l=m; t=floor(sqrt(m)); fo(i,2,t){ if (k%i==0){ l=l/i*(i-1); while (k%i==0) k/=i; } } if (k>1) l=l/k*(k-1); ans=ans*(l%mo)%mo; printf("%lld\n",ans); }