码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】【2154】Crash的数字表格

时间:2015-02-22 12:14:01      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

莫比乌斯反演

  PoPoQQQ讲义第4题

  题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html

 

  感觉两次sqrt(n)的枚举是亮点……

RE:汗- -b 10^7是8位数,开数组少打了一个0……

技术分享
 1 /**************************************************************
 2     Problem: 2154
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:8780 ms
 7     Memory:167292 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2154
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20  
21 int getint(){
22     int v=0,sign=1; char ch=getchar();
23     while(ch<0||ch>9) {if (ch==-) sign=-1; ch=getchar();}
24     while(ch>=0&&ch<=9) {v=v*10+ch-0; ch=getchar();}
25     return v*=sign;
26 }
27 /*******************tamplate********************/
28 const int N=10000086,P=20101009;
29 typedef long long LL;
30 LL prime[N],mu[N];
31 bool check[N];
32 LL n,m;
33 void getmu(int n){
34     int tot=0;
35     mu[1]=1;
36     for(int i=2;i<n;i++){
37         if (!check[i]){
38             prime[tot++]=i;
39             mu[i]=-1;
40         }
41         rep(j,tot){
42             if (i*prime[j]>n) break;
43             check[i*prime[j]]=1;
44             if (i%prime[j]) mu[i*prime[j]]=-mu[i];
45             else{
46                 mu[i*prime[j]]=0;
47                 break;
48             }
49         }
50     }
51     F(i,1,n) mu[i]=(mu[i-1]+mu[i]*i%P*i%P)%P;
52 }
53 inline LL Sum(LL n,LL m){
54     n=n*(n+1)/2%P;
55     m=m*(m+1)/2%P;
56     return n*m%P;
57 }
58 inline LL f(LL n,LL m){
59     LL ans=0,i,last;
60     for(i=1;i<=n;i=last+1){
61         last=min(n/(n/i),m/(m/i));
62         ans=(ans+(mu[last]-mu[i-1])%P*Sum(n/i,m/i)%P)%P;
63     }
64     return ans;
65 }
66 int main(){
67 //  freopen("input.txt","r",stdin);
68     n=getint(); m=getint();
69     if(n>m) swap(n,m);
70     getmu(m);
71     LL ans=0,i,last;
72     for(i=1;i<=n;i=last+1){
73         last=min(n/(n/i),m/(m/i));
74         ans=(ans+(i+last)*(last-i+1)/2%P*f(n/i,m/i)%P)%P;
75     }
76     if (ans<0) ans+=P;
77     printf("%lld\n",ans);
78     return 0;
79 }
View Code

 

【BZOJ】【2154】Crash的数字表格

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4297366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!