ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

于神之怒加强版 HYSBZ - 4407

2020-04-22 11:09:17  阅读:234  来源: 互联网

标签:神之怒 a% int HYSBZ 质数 4407 1LL FF return


给下N,M,K.求    

 

Input

输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示。

 

Output

如题

 

Sample Input1 2 3 3 Sample Output20 Hint

 

1<=N,M,K<=5000000,1<=T<=2000

 




 

设f(n)=nkf(n)=nk,则FF为ff和μμ的狄利克雷卷积。

对于FF的计算,质数时直接快速幂,质数的幂递推计算,其它数可以通过线性筛得到。

对于每次询问,分块求和即可。

时间复杂度O(n+T√n)

#include<bits/stdc++.h>
const int N=5000001,P=1000000007;
int T,n,m,i,j,k,tot,p[N],f[N],g[N],F[N],ans;bool v[N];
inline int pow(int a,int b){int t=1;for(;b;b>>=1,a=1LL*a*a%P)if(b&1)t=1LL*t*a%P;return t;}
inline int min(int a,int b){return a<b?a:b;}
int main(){
  scanf("%d%d",&T,&k);
  for(F[1]=1,i=2;i<N;i++){
    if(!v[i])f[i]=pow(i,k),g[i]=i,F[i]=f[i]-1,p[tot++]=i;
    for(j=0;j<tot&&i*p[j]<N;j++){
      v[i*p[j]]=1;
      if(i%p[j]){
        g[i*p[j]]=p[j];
        F[i*p[j]]=1LL*F[i]*F[p[j]]%P;
      }else{
        g[i*p[j]]=g[i]*p[j];
        F[i*p[j]]=g[i]!=i?1LL*F[i/g[i]]*F[g[i]*p[j]]%P:1LL*F[i]*f[p[j]]%P;
        break;
      }
    }
  }
  for(i=2;i<N;i++)F[i]=(F[i-1]+F[i])%P;
  while(T--){
    scanf("%d%d",&n,&m);
    for(ans=0,i=1;i<=n&&i<=m;i=j+1){
      j=min(n/(n/i),m/(m/i));
      ans=(1LL*(F[j]-F[i-1]+P)*(n/i)%P*(m/i)+ans)%P;
    }
    printf("%d\n",ans);
  }
  return 0;
}

 

标签:神之怒,a%,int,HYSBZ,质数,4407,1LL,FF,return
来源: https://www.cnblogs.com/xxxsans/p/12750577.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有