题意

http://acm.hdu.edu.cn/showproblem.php?pid=6706


思考

打表出奇迹。

注意到这个式子有一大堆强条件限制,最后化为:

$$\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|*[(i,j)==1]}$$

考虑莫比乌斯反演:

$$\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|}$$

$$=\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|}\sum_{d|i,d|j}{\mu(d)}$$
$$=\sum_{d=1}^{n}{\mu(d)*d*\sum_{i=1}^{\frac{n}{d}}\sum_{j-1}^{\frac{n}{d}}1}$$
$$=\sum_{d=1}^{n}{\mu(d)*d*F(\frac{n}{d})}$$

F是容易计算的。也就是说,我们要算出$\sum_{d=1}^{n}{\mu(d)*d}$在根号个点处的前缀和。杜教筛即可。

对于小于等于$10^6$的情况,线性筛预处理。


代码

 #pragma GCC optimize 2
#include<bits/stdc++.h>
#define mod 1000000007
#define G2 500000004
#define G3 333333336
#define G6 166666668
using namespace std;
typedef long long int ll;
const int maxn=1E6+;
ll T,n,m;
ll size,prime[maxn],mu[maxn],sum[maxn];
ll F[maxn],f[maxn];
int TOT;
int used[maxn];
bool vis[maxn];
ll sqr,what[maxn];
inline int where(int x)
{
return x<=sqr?x:n/x+sqr;
}
int gcd(int x,int y)
{
if(y==)
return x;
return x%y==?y:gcd(y,x%y);
}
inline ll qpow(ll x,ll y)
{
ll ans=,base=x;
while(y)
{
if(y&)
ans=ans*base%mod;
base=base*base%mod;
y>>=;
}
return ans;
}
inline ll G(ll m)
{
return (m*m%mod*(m-)%mod-m*(m-)%mod*(*m-)%mod*G3%mod+mod)%mod;
}
void init()
{
mu[]=;
f[]=;
F[]=;
for(int i=;i<=;++i)
{
if(!vis[i])
prime[++size]=i,mu[i]=-,f[i]=i-;
for(int j=;j<=size&&prime[j]*i<=;++j)
{
vis[prime[j]*i]=;
mu[prime[j]*i]=-mu[i];
f[prime[j]*i]=f[i]*f[prime[j]]%mod;
if(i%prime[j]==)
{
mu[prime[j]*i]=;
f[prime[j]*i]=f[i]*prime[j]%mod;
break;
}
}
F[i]=(F[i-]+f[i]*(ll)i%mod)%mod;
}
for(int i=;i<=;++i)
sum[i]=sum[i-]+mu[i]*(ll)i;
}
void small()
{
cout<<(F[n]-+mod)*G2%mod<<endl;
}
ll calc(ll n)
{
if(used[where(n)]==TOT)
return what[where(n)];
if(n<=)
return what[where(n)]=sum[n];
ll g=;
for(ll l=,r;l<=n;l=r+)
{
r=n/(n/l);
g=(g-(r-l+)*(r+l)%mod*G2%mod*calc(n/l)%mod+mod)%mod;
}
used[where(n)]=TOT;
return what[where(n)]=g;
}
inline ll getsum(int x)
{
if(x<=)
return sum[x];
return what[where(x)];
}
void big()
{
++TOT;
sqr=sqrt(n+0.5);
ll GG=calc(n);
ll ans=;
for(int l=,r;l<=n;l=r+)
{
r=n/(n/l);
ans=(ans+(getsum(r)-getsum(l-)+mod)*G(n/l)%mod)%mod;
}
cout<<ans*G2%mod<<endl;
}
void solve()
{
ll a,b;
cin>>n>>a>>b;
if(n<=)
small();
else
big();
}
int main()
{
ios::sync_with_stdio(false);
init();
cin>>T;
while(T--)
solve();
return ;
}

最新文章

  1. RapidJson读取json文档
  2. lumen 错误&amp;日志
  3. 在共享DLL中使用MFC
  4. 53个要点提高php效率
  5. /dev/random和/dev/urandom的一点备忘
  6. Linux的环境变量总结
  7. 【一】仿微信飞机大战cocos2d-x3.0rc1
  8. IOS 上线问题
  9. RecycleView和CardView
  10. FCKEditor在jsp页面中的配置方法
  11. 文本域、bootstrap-table显示以及MySQL三者间的换行符问题
  12. Spring框架入门之基于xml文件配置bean详解
  13. java基础笔记(4)----数组
  14. C# WinForm 富文本编辑器 用kindeditor实现本地图片只选取不上传到编辑器
  15. vscode 打开多个标签页
  16. 装饰器模式 Decorator 结构型 设计模式 (十)
  17. Day24-ModelForm操作及验证
  18. 关于BI商业智能的“8大问”|一文读懂大数据BI
  19. JQuery弹出层,点击按钮后弹出遮罩层,有关闭按钮【转】
  20. python selenium爬取自如租房数据保存到TXT文件

热门文章

  1. 在Android上为所欲为的一些技术
  2. 23.logging
  3. 如何把对象手动注入Spring容器并实现依赖注入
  4. Java集合使用之next方法与remove方法 | Java集合使用之remove方法使用易错
  5. DecoratorPattern(装饰器模式)-----Java/.Net
  6. 使用宝塔搭建nextcloud的过程(搭建、优化、问题)
  7. C# async await 死锁问题总结
  8. .net core 开车记:Data Protection Key 过期问题与登录页面访问慢
  9. 看完这篇HTTP,跟面试官扯皮就没问题了
  10. Spring多数据源动态切换