记录编号 |
230829 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[BZOJ 4407] 于神之怒加强版 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
19.742 s |
提交时间 |
2016-02-24 11:36:41 |
内存使用 |
107.59 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const LL MOD=1000000007;
const int SIZEN=5000010,SIZET=2010;
int T,K;
int n[SIZET],m[SIZET];
int maxn=0;
bool co[SIZEN]={0};
int pri[SIZEN],mu[SIZEN];
LL F[SIZEN];
LL f[SIZEN];
int cnt=0;
LL qpow(LL x,int y)
{
LL re=1;
while(y)
{
if(y&1) re*=x;
y>>=1;x*=x;re%=MOD;x%=MOD;
}
return re;
}
void prepare()
{
for(int i=1;i<=maxn;i++) mu[i]=1,F[i]=1;
for(LL i=2;i<=maxn;i++)
{
if(!co[i])
{
pri[++cnt]=i;
mu[i]=-1;
f[i]=qpow(i,K);f[i]%=MOD;
F[i]=(f[i]-1+MOD)%MOD;
for(LL j=2*i;j<=maxn;j+=i)
{
co[j]=1;
if(j%(i*i)==0) {mu[j]=0;F[j]=F[j/i]*f[i];F[j]%=MOD;}
else {mu[j]*=(-1);F[j]*=F[i];F[j]%=MOD;}
}
}
}
F[0]=0;F[1]=1;
//for(int i=1;i<=100;i++) cout<<F[i]<<endl;
for(int i=1;i<=maxn;i++) F[i]+=F[i-1],F[i]%=MOD;
}
void clac(LL N,LL M)
{
int j=0;
LL ans=0;
for(LL i=1;i<=min(N,M);i=j+1)
{
j=min(N/(N/i),M/(M/i));
ans+=((F[j]-F[i-1]+MOD)%MOD)*(N/i)%MOD*(M/i)%MOD;
ans%=MOD;
}
printf("%I64d\n",ans);
}
int main()
{
freopen("bzoj_4407.in","r",stdin);
freopen("bzoj_4407.out","w",stdout);
scanf("%d%d",&T,&K);
for(int i=1;i<=T;i++)
{
scanf("%d%d",&n[i],&m[i]);
maxn=max(maxn,max(n[i],m[i]));
}
prepare();
for(int i=1;i<=T;i++)
{
int N=n[i],M=m[i];
clac(N,M);
}
return 0;
}