「luogu1829」 [国家集训队]Crash的数字表格

莫比乌斯反演推柿子,数论分块降复杂度,最后时间复杂度为O(n)。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=1e7+10,mod=20101009;
 5 int n,m,mi;
 6 ll p[N],tot;
 7 ll u[N];
 8 bool isp[N];
 9 void getu(int lim){
10     u[1]=1;
11     for(int i=2;i<=lim;i++){
12         if(!isp[i]) u[i]=-1,p[++tot]=i;
13         for(int j=1;j<=tot&&1LL*i*p[j]<=lim;j++){
14             isp[p[j]*i]=1,u[i*p[j]]=-u[i];
15             if(!(i%p[j])){u[i*p[j]]=0;break;}
16         }
17     }
18     for(int i=2;i<=lim;i++) u[i]=((u[i]*i*i+u[i-1])%mod+mod)%mod;
19     return;
20 }
21 ll solve(int d){
22     ll x=n/d,y=m/d,l=1,r,lim=mi/d,res=0;
23     while(l<=lim){
24         r=min(x/(x/l),y/(y/l));
25         ll temp=((x/l+1)*(x/l)/2%mod)*((y/l+1)*(y/l)/2%mod)%mod;
26         res=((res+(u[r]-u[l-1])*temp)%mod+mod)%mod;
27         l=r+1;
28     }
29     return res;
30 }
31 int main(){
32     scanf("%d%d",&n,&m);
33     mi=min(n,m);
34     getu(mi);
35     ll ans=0;
36     int l=1,r;
37     while(l<=mi){
38         r=min(n/(n/l),m/(m/l));
39         ans=(ans+solve(l)*(l+r)*(r-l+1)/2+mod)%mod;
40         l=r+1;
41     }
42     printf("%lld",ans);
43     return 0;
44 } 

原文地址:https://www.cnblogs.com/mycups/p/8571340.html

时间: 2024-10-10 15:11:45

「luogu1829」 [国家集训队]Crash的数字表格的相关文章

[国家集训队]Crash的数字表格 / JZPTAB

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

【题解】[国家集训队]Crash的数字表格 / JZPTAB

求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{gcd\left ( i,j \right )}\), 所以原本的式子转化为:\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}\frac{ij}{gcd\left ( i,j \right )}\). 注意到\(i, j\) 均为 \(gcd\left ( i,j \right

P1829 [国家集训队]Crash的数字表格 / JZPTAB

推式子太快乐啦!虽然我好蠢而且dummy和maomao好巨(划掉) 思路 莫比乌斯反演的题目 首先这题有\(O(\sqrt n)\)的做法但是我没写咕咕咕 然后就是爆推一波式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j) \] \[ \sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i\times j}{gcd(i,j)} \] 设$ gcd(i,j)=d$ \[ \sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac

【[国家集训队]Crash的数字表格 / JZPTAB】

这道题我们要求的是 \[\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\] 总所周知\(lcm\)的性质不如\(gcd\)优雅,但是唯一分解定理告诉我们\(gcd(i,j)\times lcm(i,j)=i\times j\) 所以很容易的可以转化成这个柿子 \[\sum_{i=1}^N\sum_{j=1}^M\frac{i\times j}{(i,j)}\] 现在开始套路了 先设两个函数 \[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)==n]\ti

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还在想着课上学的东西,为了研究

【莫比乌斯反演】关于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

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

[bzoj2117] [2010国家集训队]Crash的旅游计划

静态信息的点分治. 老套路,对各个重心用数据结构维护所管辖的点到它的距离..再去重一波 查询的时候就直接二分了..如果数据结构用动态开点的线段树的话就可以直接在线段树上找了..不过我还是写了treap 时间复杂度O(nlog^3n) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 const int