[BZOJ4407]于神之怒加强版

BZOJ挂了。。。

先把程序放上来,如果A了在写题解吧。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 5000010
 4 #define ll long long
 5 #define mod (int)(1e9+7)
 6 using namespace std;
 7 char ch,B[1<<15],*S=B,*T=B;
 8 #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++)
 9 inline int read()
10 {
11     int x=0,f=1;char ch=getc();
12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
13     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
14     return x*f;
15 }
16 inline int ksm(ll x,ll y)
17 {
18     ll p=1;
19     while(y)
20     {
21         if(y&1)p=p*x%mod;
22         x=x*x%mod;y>>=1;
23     }
24     return p;
25 }
26 int prime[N],tot,f[N],p[N],k;
27 bool vis[N];
28 void pre(int t)
29 {
30     f[1]=1;
31     for(int i=2;i<=t;i++)
32     {
33         if(!vis[i])
34         {
35             prime[++tot]=i;
36             p[tot]=ksm(i,k);
37             f[i]=p[tot]-1;
38         }
39         for(int j=1;j<=tot&&i*prime[j]<=t;j++)
40         {
41             vis[i*prime[j]]=1;
42             if(!(i%prime[j]))
43             {
44                 f[i*prime[j]]=(ll)f[i]*p[j]%mod;
45                 break;
46             }
47             f[i*prime[j]]=(ll)f[i]*f[prime[j]]%mod;
48         }
49     }
50     for(int i=1;i<=t;i++)
51     f[i]=(f[i]+f[i-1])%mod;
52 }
53 int n[2005],m[2005],t,maxn;
54 int main()
55 {
56     t=read();k=read();
57     for(int i=1;i<=t;i++)
58     {
59         n[i]=read();
60         m[i]=read();
61         if(n[i]>m[i])swap(n[i],m[i]);
62         maxn=max(maxn,n[i]);
63     }
64     pre(maxn);
65     for(int z=1;z<=t;z++)
66     {
67         int ans=0;
68         for(int i=1,j;i<=n[z];i=j+1)
69         {
70             j=min(n[z]/(n[z]/i),m[z]/(m[z]/i));
71             ans=(ans+((ll)(f[j]+mod-f[i-1])*(n[z]/i)%mod*(m[z]/i)%mod))%mod;
72         }
73         printf("%d\n",ans);
74     }
75 }
View Code

 

你可能感兴趣的:([BZOJ4407]于神之怒加强版)