https://www.luogu.org/problemnew/show/P4449

\(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i,j)^k\)

首先加方括号,枚举g,提g:(\(min\)表示\(min(n,m)\))

\(\sum\limits_{g=1}^{min} g^k \sum\limits_{i=1}^{n} \sum\limits_{i=1}^{m} [gcd(i,j)==g]\)

\(\sum\limits_{g=1}^{min} g^k \sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor} \sum\limits_{i=1}^{\lfloor\frac{m}{g}\rfloor} [gcd(i,j)==1]\)

后面莫比乌斯反演:(k被你用了真恶心)

\(\sum\limits_{g=1}^{min} g^k \sum\limits_{x=1}^{min} \mu(x){\lfloor\frac{n}{gx}\rfloor} {\lfloor\frac{m}{gx}\rfloor}\)

众所周知,这种情况要枚举\(T=gx\):

\(\sum\limits_{T=1}^{min}\sum\limits_{g|T} g^k \mu(\frac{T}{g}) {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor}\)

提T:

\(\sum\limits_{T=1}^{min} {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor} \sum\limits_{g|T} g^k \mu(\frac{T}{g})\)

所以:

\(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i,j)^k = \sum\limits_{T=1}^{min} {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor} \sum\limits_{g|T} g^k \mu(\frac{T}{g})\)


\(n,m\)这么小那我给你搞个线性筛吧。记 \(G(n)=\sum\limits_{g|n} g^k \mu(\frac{n}{g})\) ,这个可以 \(O(nlogn)\) 筛出来。但是我偏偏要线性筛。

每次回答一个分块了事了。


小心取模,靠。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; inline int read() {
int x=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
do {
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
} while(c>='0'&&c<='9');
return x;
} inline void write(ll x) {
if(x>9) {
write(x/10);
}
putchar(x%10+'0');
return;
} const int MAXN=5e6;
const int MOD=1e9+7; int pri[MAXN+1];
int &pritop=pri[0];
ll G[MAXN+1];
int pk[MAXN+1]; int k; inline ll qpow(ll x,int n) {
ll res=1;
while(n) {
if(n&1) {
res*=x;
if(res>=MOD)
res%=MOD;
}
x*=x;
if(x>=MOD)
x%=MOD;
n>>=1;
}
return res;
} void sieve(int n=MAXN) {
pk[1]=1;
G[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
G[i]=qpow(i,k)-1ll;
if(G[i]<0)
G[i]+=MOD;
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
if(t>n)
break;
pri[t]=1;
if(i%p) {
pk[t]=pk[p];
//积性函数
G[t]=G[i]*G[p];
if(G[t]>=MOD)
G[t]%=MOD;
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
//t是质数的幂次
G[t]=qpow(p,k)*G[i];
if(G[t]>=MOD)
G[t]%=MOD;
} else {
//积性函数
G[t]=G[pk[t]]*G[t/pk[t]];
if(G[t]>=MOD)
G[t]%=MOD;
}
break;
}
}
} for(int i=1;i<=n;i++){
G[i]+=G[i-1];
if(G[i]>=MOD)
G[i]-=MOD;
}
} inline ll ans(int n,int m) {
ll res=0;
int N=min(n,m);
for(int l=1,r;l<=N;l=r+1){
r=min(n/(n/l),m/(m/l));
ll tmp1=1ll*(n/l)*(m/l);
if(tmp1>=MOD)
tmp1%=MOD;
ll tmp2=G[r]-G[l-1];
if(tmp2<0)
tmp2+=MOD;
tmp1*=tmp2;
if(tmp1>=MOD)
tmp1%=MOD;
res+=tmp1;
if(res>=MOD)
res%=MOD;
}
return res;
} inline void solve() {
int t=read();
k=read();
sieve();
while(t--) {
int n=read(),m=read();
write(ans(n,m));
putchar('\n');
}
} int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
solve();
return 0;
}

最新文章

  1. [python]获取文件夹下所有文件名
  2. e_msg_c_gs_enter_gs_req
  3. 我去,徒弟半夜来电让写一个PHP短信验证(和群发)
  4. INSTALLMENT of QValue
  5. C# ProperTyGrid 自定义属性
  6. 常用myeclipse的快捷键,对菜鸟超有用的
  7. 使用 IDEA 创建 Maven Web 项目 (一)- 使用IEAD创建Maven项目
  8. 你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
  9. CS窗体程序数据列表分页
  10. 再说Postgres中的高速缓存(cache)
  11. python 多线程 ping
  12. CF444E. DZY Loves Planting
  13. 【集合】Java中的具体集合(一)
  14. 仿B站项目——(1)计划,前端工程
  15. Linux MySQL 安装、远程访问和密码重置
  16. LeeTCode题解之Remove Duplicates from Sorted List
  17. JVM进程cpu飙高分析
  18. android studio开发的时候出现design editor is unavailable until after a successful project sync问题的解决方法
  19. RNN概述-深度学习 -神经网络
  20. AWT从概念产生到完成实现只用了一个月

热门文章

  1. 果壳、推库、虎秀、知乎、it世界
  2. SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第二天任务攻略
  3. uva 10733 The Colored Cubes&lt;polya定理&gt;
  4. Communicating sequential processes
  5. macos下查看用户组,以及修改文件权限
  6. HTML5 &lt;template&gt;
  7. IE浏览器没有加载CSS或js文件的秘密及解决办法
  8. Oracle数据查看被锁住的用户
  9. Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用](秒杀imageloader)
  10. bootstrap 学习笔记(4)---- 按钮