记录编号 | 230829 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [BZOJ 4407] 于神之怒加强版 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | 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; }