BZOJ 4174 tty的求助 莫比乌斯反演
題目大意:求∑Nn=1∑Mm=1∑m?1k=0?nk+xm??mod?998244353
如果n和m都已經(jīng)確定了。如今要求這坨玩應(yīng):
∑m?1k=0?nk+xm?
=∑m?1k=0(?nk%m+xm?+nk?nk%mm)
=∑m?1k=0(?nk%m+xm?+nkm?nk%mm)
我們一項(xiàng)一項(xiàng)考慮
令d=gcd(n,m),那么有
∑m?1k=0?nk%m+xm?
=d?∑md?1k=0?kd+xm?
=d?(md?x?x%mm+∑md?1k=0?kd+x%mm?)
=d?(md?x?x%mm+∑md?1k=0[kd+x%m≥m])
=d?(x?x%md+?x%md?)
=d??xd?
∑m?1k=0nkm=nm?m?(m?1)2=n?m?n2
∑m?1k=0nk%mm=d?∑md?1k=0kdm=d2m?(md?1)?md2=m?d2
故答案為
∑Nn=1∑Mm=1(d??xd?+n?m?n2?m?d2)
=12?∑Nn=1∑Mm=1(2?d??xd?+d+n?m?n?m)
=12?(S(N)?S(M)?S(N)?m?S(M)?n+∑min(N,M)d=1(d+2?d??xd?)∑min(?Nd?,?Md?)k=1μ(k)??Nd?k???Md?k?)
當(dāng)中S(n)=n?(n+1)2
然后O(nlogn)枚舉d和k就可以
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 500500 #define MOD 998244353 using namespace std; int n,m,x; long long ans; int mu[M]; int prime[M],tot; bool not_prime[M]; void Linear_Shaker() {int i,j;mu[1]=1;for(i=2;i<=500000;i++){if(!not_prime[i]){prime[++tot]=i;mu[i]=MOD-1;}for(j=1;prime[j]*i<=500000;j++){not_prime[prime[j]*i]=true;if(i%prime[j]==0){mu[prime[j]*i]=0;break;}mu[prime[j]*i]=(MOD-mu[i])%MOD;}} } long long Sum(long long n) {return (n*(n+1)>>1)%MOD; } int main() {int i,j;cin>>n>>m>>x;Linear_Shaker();ans=((Sum(n)*Sum(m)-Sum(n)*m-Sum(m)*n)%MOD+MOD)%MOD;if(n>m) swap(n,m);for(i=1;i<=n;i++){long long temp=i+x/i*i*2;for(j=1;j*i<=n;j++)(ans+=temp*mu[j]%MOD*(n/i/j)%MOD*(m/i/j)%MOD)%=MOD;}cout<<(ans*(MOD+1>>1)%MOD)<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的BZOJ 4174 tty的求助 莫比乌斯反演的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下使用C++ Json库
- 下一篇: 数据库SQL Server2012笔记(