【莫比乌斯反演】BZOJ2154 Crash的数字表格

Description

  求sigma lcm(x,y),x<=n,y<=m。n,m<=1e7。

Solution

  lcm没有什么直接做的好方法,用lcm=x*y/gcd转成gcd来做

  就是要求sigma d*f(x/d,y/d)

  f(x,y)为x和y以内gcd正好为1的对数

  F为所有对数,于是有F(x,y)=x*(x+1)/2*y*(y+1)/2

  f(x,y)=sigma (1<=i<=x) i*i*mu(i)*F(x/i,y/i)

  f用莫比乌斯反演解决,这两个式子都套上分块优化到sqrt,于是总复杂度sqrt*sqrt=n

  分块优化具体可以见上一篇blog

Code

  一开始全开LL MLE了一发

  然后又WA了两发,第一次是有一地方算的时候溢出

  一开始为了避免MLE把prime数组/50,但其实只能/20的样子

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define ll long long
 5 using namespace std;
 6 const int maxn=1e7+5,mod=20101009;
 7
 8 bool flag[maxn];
 9 int prime[maxn],mu[maxn],cnt;
10 int sum[maxn],s[maxn];
11 int n,m;
12
13 void getmu(){
14     mu[1]=1;
15     for(int i=2;i<=n;i++){
16         if(!flag[i]){
17             mu[i]=-1;
18             prime[++cnt]=i;
19         }
20         for(int j=1;i*prime[j]<=n&&j<=cnt;j++){
21             flag[i*prime[j]]=1;
22             if(i%prime[j]==0){
23                 mu[i*prime[j]]=0;
24                 break;
25             }
26             mu[i*prime[j]]=-mu[i];
27         }
28     }
29     for(int i=1;i<=n;i++)
30         sum[i]=(sum[i-1]+(ll)i*i*mu[i]%mod)%mod;
31 }
32
33 ll F(int x,int y){
34     return (ll)((ll)x*(x+1)/2%mod)*((ll)y*(y+1)/2%mod)%mod;
35 }
36
37 ll f(int x,int y){
38     ll ret=0;
39     int p;
40     for(int i=1;i<=x;i=p+1){
41         p=min(x/(x/i),y/(y/i));
42         ret=(ret+(ll)(sum[p]-sum[i-1])*F(x/i,y/i))%mod;
43     }
44     return ret;
45 }
46
47 int main(){
48     scanf("%d%d",&n,&m);
49     if(n>m) swap(n,m);
50     for(int i=1;i<=n;i++) s[i]=(s[i-1]+i)%mod;
51     getmu();
52
53     int pos;
54     ll ans=0;
55     for(int i=1;i<=n;i=pos+1){
56         pos=min(n/(n/i),m/(m/i));
57         ans=(ans+(ll)(s[pos]-s[i-1])*f(n/i,m/i))%mod;
58     }
59     printf("%lld\n",(ans+mod)%mod);
60     return 0;
61 }
时间: 2024-08-25 18:56:30

【莫比乌斯反演】BZOJ2154 Crash的数字表格的相关文章

bzoj2154 Crash的数字表格 莫比乌斯反演

Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12

BZOJ2154 Crash的数字表格

昨天看了iwtwiioi的推导感觉很神! 今天想写结果又忘了怎么推的啦...233 1 /************************************************************** 2 Problem: 2154 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:5124 ms 7 Memory:127760 kb 8 ****************************************

BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][Discuss] Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究

Crash的数字表格(莫比乌斯反演)

Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张NM的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4 5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12

【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&amp;&amp;BZOJ 2693 jzptab)

BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4

【BZOJ 2154】Crash的数字表格 (莫比乌斯+分块)

2154: Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4 10 3

【bzoj2154】Crash的数字表格 莫比乌斯反演

题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1  2  3  4  5 2  2  6  4  10 3  6  3  12 15 4

【bzoj2154】 Crash的数字表格

http://www.lydsy.com/JudgeOnline/problem.php?id=2154 (题目链接) 题意 给出${n,m}$,求$${\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)}$$ Solution 莫比乌斯反演,推啊推式子. \begin{aligned}  \sum_{i=1}^n\sum_{j=1}^mlcm(i,j)=&\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}  \\  =&\sum_{g=1

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

莫比乌斯反演 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