参考:http://blog.csdn.net/wzf_2000/article/details/54630931

有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk)=\phi(k)\sum_{d|gcd(n,k)}\phi(\frac{n}{d}) \)然后看n的范围比较友好就先不去管它,先看后面的:

\[if |\mu(i)|==1
\]

\[\sum_{k=1}^{i}\sum_{d|i,d|k}\phi(\frac{n}{d})\phi(k)
\]

\[=\sum_{d|i}\phi(\frac{n}{d})\sum_{k=1}^{\left \lfloor \frac{m}{d} \right \rfloor}\phi(dk)
\]

发现这形成了一个子问题的形式,于是可以用杜教筛。

对于其他的部分,k是i的因数中最大的且\( |\mu(k)|==1 \)的数:

\[if |\mu(i)|==0
\]

\[\sum_{j=1}^{m}\phi(ij)=\frac{i\sum_{j=1}^{m}\phi(kj)}{k}
\]

时间复杂度不会算

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
const int N=1000005,m=1000000,mod=1e9+7;
int phi[N],mi[N],q[N],tot,n,k,s[N],ans[N];
bool v[N];
map<long long,int>mp;
int S(int n,int l)
{
if(l<=1)
return phi[n*l];
if(n==1)
{
if(l<=m)
return s[l];
if(ans[k/l]!=-1)
return ans[k/l];
long long re=(long long)l*(l+1)/2%mod;
for(int i=2,la;i<=l;i=la+1)
{
la=l/(l/i);
if(l/i<=m)
re=(re-(long long)s[l/i]*(la-i+1)%mod)%mod;
else
re=(re-(long long)S(1,l/i)*(la-i+1)%mod)%mod;
}
return ans[k/l]=(re%mod+mod)%mod;
}
if(mp[(long long)n*mod+l])
return mp[(long long)n*mod+l];
long long re=0ll;
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
re=(re+(long long)phi[n/i]*S(i,l/i)%mod)%mod;
if(i*i!=n)
re=re+(long long)phi[i]*S(n/i,l/(n/i))%mod;
}
return mp[(long long)n*mod+l]=(re%mod+mod)%mod;
}
int main()
{
memset(ans,-1,sizeof(ans));
mi[1]=phi[1]=1;
for(int i=2;i<=m;i++)
{
if(!v[i])
{
q[++tot]=i;
phi[i]=i-1;
mi[i]=i;
}
for(int j=1;j<=tot&&i*q[j]<=m;j++)
{
int k=i*q[j];
v[k]=1;
if(i%q[j]==0)
{
phi[k]=phi[i]*q[j];
mi[k]=mi[i];
break;
}
phi[k]=phi[i]*(q[j]-1);
mi[k]=mi[i]*q[j];
}
}
for(int i=1;i<=m;i++)
s[i]=(s[i-1]+phi[i])%mod;
scanf("%lld%lld",&n,&k);
if(n>k)
swap(n,k);
long long ans=0ll;
for(int i=1;i<=n;i++)
ans=(ans+((long long)i/mi[i]*S(mi[i],k)%mod))%mod;
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}

最新文章

  1. 搭建了个人的github.io博客
  2. Linux0.11内核--系统调用机制分析
  3. Listview的使用
  4. HTML 5 应用程序缓存(上)
  5. [BUG集] android 安卓项目中ORMLITE框架 Must specify one of id, generatedId, and generatedIdSequence with Id
  6. jQuery时间轴插件:jQuery Timelinr
  7. Java Web编程的主要组件技术——JDBC
  8. CodeForces 429B Working out 动态规划
  9. 记vue API 知识点
  10. MySQL事务(学习笔记)
  11. es6 语法 (symbol)
  12. Android如何实现茄子快传
  13. Clean ThreadLocals
  14. Flask结合Redis消息队列实现电影弹幕
  15. CAP 一致性协议及应用解析
  16. springmvc中同步/异步请求参数的传递以及数据的返回
  17. How to implement *All-Digital* analog-to-digital converters in FPGAs and ASICs
  18. kubernetes基础概念
  19. hadoop 3.1.1 安装
  20. [C++] c Struct VS c++ Struct

热门文章

  1. UINavigationController 小记
  2. 洛谷—— P1714 切蛋糕
  3. CF723E(欧拉回路)
  4. HDU 4279 Number(找规律)
  5. 【Nginx】惊群问题
  6. 微信小程序 自定义组件(stepper)
  7. 一个Exchange 2010 的password不定期弹框的问题处理,希望对大家可以有所帮助。
  8. 【HRS项目】Axure兴许问题解决---与SVN结合
  9. notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比方lua、python等)
  10. React通过Ajax获取数据