求条
查看原帖
求条
1000298
Vsinger_洛天依楼主2024/1/10 20:22

就 A 一个点,10 pts 了

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int mod=1e9+7,N=5e6;
int T,n,m,k,mu[N],pri[N],tot,vis[N],low[N],sum[N];
inline int read(){
    int ch=0,p=1;char c=getchar();
    for(;c>'9'||c<'0';c=getchar())if(c=='-')p=-1;
    for(;c>='0'&&c<='9';c=getchar())ch=ch*10+c-'0';
    return ch*p;
}
inline int qpow(int a,int b) {
    int ans=1;
    for(;b;b>>=1,a=a*a%mod) 
        if(b&1) 
            ans=ans*a%mod;
    return ans;
}
signed main(){
    T=read(),k=read();
    mu[1]=sum[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i]) mu[i]=-1,pri[++tot]=i,sum[i]=qpow(i,k)-1,low[i]=i;
        for(int j=1;j<=tot&&i*pri[j]<N;++j){
            vis[i*pri[j]]=1;
            if(i%pri[j]==0){
                low[i*pri[j]]=low[i]*pri[j];
                mu[i*pri[j]]=0;
                if(low[i]==i) sum[i*pri[j]]=sum[i]*qpow(pri[j],k)%mod;
                else sum[i*pri[j]]=sum[i/low[i]]*sum[pri[j]*low[i]]%mod;
                break;
            }
            low[i*pri[j]]=pri[j];
            mu[i*pri[j]]=-mu[i];
            sum[i*pri[j]]=sum[i]*sum[pri[j]]%mod;
        }
    }
    for(int i=1;i<N;++i) 
        sum[i]=(sum[i-1]+sum[i])%mod; 
    while(T--){
        n=read(),m=read();
        int ans=0;
        for(int i=1,j;i<=min(n,m);i=j+1){
            j=min(n/(n/i),m/(m/i));
            ans=(ans+(sum[j]-sum[i-1])%mod*(n/i)%mod*(m/i)%mod)%mod;
        }
        cout<<ans%mod<<endl;
    }
}
2024/1/10 20:22
加载中...