简要题意: 求 一言不合就推式子。 其中 回到原式: 括号内的东西我们预处理,括号外面的直接 整除分块。(实际上没有这个必要了) 那么如何预处理呢?单独搞出这个式子。 咦?是不是很熟悉? (其实 那么可得: 即 所以用线性筛预处理即可。 时间复杂度: 实际得分:
i=1∑nj=1∑mlcm(i,j)
i=1∑nj=1∑mlcm(i,j)
=i=1∑nj=1∑mgcd(i,j)ij
=d=1∑min(n,m)d1i=1∑mj=1∑nij[gcd(i,j)==d]
=d=1∑min(n,m)d1i=1∑⌊dn⌋j=1∑⌊dm⌋ijd2[gcd(i,j)==1]
=d=1∑min(n,m)di=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)==1]
=d=1∑min(n,m)di=1∑⌊dn⌋j=1∑⌊dm⌋ijx∣gcd(i,j)∑μx
=d=1∑min(n,m)dx=1∑min(⌊dn⌋,⌊dm⌋)x2μxs⌊dxn⌋s⌊dxm⌋
sx=i=1∑xi=2x×(x+1)
=T=1∑ns⌊Tn⌋s⌊Tm⌋(Td∣T∑dμT)
Td∣T∑dμT
TμTd∣T∑d
TμT 我们直接预处理就可以了。考虑,令:
fi=d∣i∑d
fi 就是
i 的因数之和)
fi×j=fi×fj([gcd(i,j)]==1)
f 为 积性函数。
O(n).
100pts.#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e7+1; const ll MOD=20101009; inline int read(){char ch=getchar(); int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();} int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int prime[N],mu[N],n,m; int cnt=0; bool h[N]; ll ans=0; inline void Euler(int n) { mu[1]=1; for(register int i=2;i<=n;i++) { if(!h[i]) mu[i]=MOD-i+1,prime[++cnt]=i; for(register int j=1;j<=cnt && i*prime[j]<=n;j++) { h[i*prime[j]]=1; if(i%prime[j]==0) {mu[i*prime[j]]=mu[i];break;} mu[i*prime[j]]=(1ll*mu[i]*mu[prime[j]])%MOD; } } for(register int i=1;i<=n;i++) mu[i]=1ll*mu[i]*i%MOD; for(register int i=1;i<=n;i++) mu[i]=(mu[i]+mu[i-1])%MOD; } //欧拉筛预处理 inline ll Sieve(ll n) {return (n*(n+1)>>1)%MOD;} //求 s int main() { Euler(N-1); n=read(),m=read(); if(n>m) swap(n,m); for(int l=1;l<=n;) { int r=min(n/(n/l),m/(m/l)); ans=(ans+1ll*(mu[r]-mu[l-1]+MOD)*Sieve(n/l)%MOD*Sieve(m/l)%MOD)%MOD; l=r+1; //整除分块 } printf("%lldn",ans); return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算