[国家集训队]Crash的数字表格 / JZPTAB
题目要求,求:
\]
先转化为gcd的形式,然后枚举gcd。
\]
把d除进去,套用莫比乌斯函数的性质:
\]
继续替换得到:
\]
其中s(n)表示\(\sum_{i=1}^ni\)
这个其实已经可以做了,直接枚举d,然后里面使用整除分块完成。这个看起来复杂度是\(O(n\sqrt{n})\)的,但是实际上它每次没有跑满,复杂度是\(O(n)\)左右的。
不过这个是弱化版,加强版还要求处理多组数据,这时候上面的做法就不好使了。继续推导,设\(T=dp\)
\]
设\(h(T) = \sum_{d|T}d\mu(d)\)问题在于怎么能快速求出\(h(T)\)
这并不是一个积性函数,但是我们仍然能线性把它筛出来。首先考虑T为质数的时候,这时候显然\(h(T) = 1 - T\)。如果现在加入一个已经出现在T中的质因子p,那么所有T原来的因子在乘上这个p之后,p的指数必然大于1,也就是说其莫比乌斯函数的值是0,原来的因子不变,所以\(h(Tp) = h(T)\).再考虑新加入一个因子的情况。加入之后,原来所有的因子其莫比乌斯函数的值变成其相反数,而且因为前面还有乘p,所以\(h(Tp) = (1-p)h(T)\),即\(h(Tp) = h(p)h(T)\)
所以我们把它线性筛出来,之后整除分块做即可。单次复杂度\(O(\sqrt{n})\)。注意因为此题有取模,所以要注意前缀和相减的时候,先变成正数。
弱化版代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
#define fr friend inline
#define y1 poj
#define mp make_pair
#define pr pair<int,int>
#define fi first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
const int M = 10000005;
const int INF = 1000000009;
const ll mod = 20101009;
const double eps = 1e-7;
int read()
{
int ans = 0,op = 1;char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();
return ans * op;
}
ll k,p[M],mu[M],tot,n,m;
ll sum[M],ans,pre[M];
bool np[M];
void euler()
{
np[1] = 1,mu[1] = 1;
rep(i,2,M-2)
{
if(!np[i]) p[++tot] = i,mu[i] = -1;
for(int j = 1;i * p[j] <= M-2;j++)
{
np[i * p[j]] = 1;
if(!(i % p[j])) break;
mu[i * p[j]] = -mu[i];
}
}
rep(i,1,M-2) pre[i] = (pre[i-1] + (ll)i * (ll)i % mod * mu[i]) % mod;
rep(i,1,M-2) sum[i] = (sum[i-1] + (ll)i) % mod;
}
int main()
{
euler();
n = read(),m = read();
int lim = min(n,m);
rep(d,1,lim)
{
int a = n / d,b = m / d,c = min(a,b);
ll cur = 0;
for(int i = 1,j;i <= c;i = j + 1)
{
j = min(a / (a / i),b / (b / i));
cur += ((pre[j] - pre[i-1] + mod) % mod * sum[a / i] % mod * sum[b / i] % mod),cur %= mod;
}
ans += (cur * (ll)d % mod),ans %= mod;
}
printf("%lld\n",ans);
return 0;
}
强化版代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
#define fr friend inline
#define y1 poj
#define mp make_pair
#define pr pair<int,int>
#define fi first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
const int M = 10000005;
const int INF = 1000000009;
const ll mod = 20101009;
const double eps = 1e-7;
int read()
{
int ans = 0,op = 1;char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();
return ans * op;
}
ll k,p[M],mu[M],tot,n,m;
ll sum[M],ans,pre[M],f[M];
bool np[M];
void euler()
{
np[1] = 1,f[1] = 1;
rep(i,2,M-2)
{
if(!np[i]) p[++tot] = i,f[i] = (1 - i + mod) % mod;
for(int j = 1;i * p[j] <= M-2 && j <= tot;j++)
{
np[i * p[j]] = 1;
if(!(i % p[j])) {f[i * p[j]] = f[i];break;}
f[i * p[j]] = f[i] * f[p[j]] % mod;
}
}
rep(i,1,M-2) pre[i] = (pre[i-1] + ((ll)i * f[i] % mod)) % mod;
rep(i,1,M-2) sum[i] = (sum[i-1] + (ll)i) % mod;
}
int main()
{
euler();
n = read(),m = read();
int lim = min(n,m);
for(int i = 1,j;i <= lim;i = j + 1)
{
j = min(n / (n / i),m / (m / i));
ans += ((pre[j] - pre[i-1] + mod) % mod * sum[n / i] % mod * sum[m / i] % mod),ans %= mod;
}
printf("%lld\n",ans);
return 0;
}
[国家集训队]Crash的数字表格 / JZPTAB的更多相关文章
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告
[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...
- [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)
题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...
- 题解-[国家集训队]Crash的数字表格 / JZPTAB
题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...
- [luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】
传送门:洛谷,bzoj 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整 ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...
- 【题解】[国家集训队]Crash的数字表格 / JZPTAB
求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{ ...
- P1829 [国家集训队]Crash的数字表格 / JZPTAB
推式子太快乐啦!虽然我好蠢而且dummy和maomao好巨(划掉) 思路 莫比乌斯反演的题目 首先这题有\(O(\sqrt n)\)的做法但是我没写咕咕咕 然后就是爆推一波式子 \[ \sum_{i= ...
- 【[国家集训队]Crash的数字表格 / JZPTAB】
这道题我们要求的是 \[\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\] 总所周知\(lcm\)的性质不如\(gcd\)优雅,但是唯一分解定理告诉我们\(gcd(i,j)\time ...
- [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演
---题面--- 题解: $$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{\frac{ij}{gcd(i, j)}}$$ 改成枚举d(设n < m) $$ans ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
传送门 式子好麻烦orz……大佬好腻害orz->这里 //minamoto #include<iostream> #include<cstdio> #define ll ...
随机推荐
- iOS开发 使用Cocoapods管理第三方类库
每次上github看到一些优秀的代码,总能看到Podfile,也了解是个管理第三方类库的,今天抽时间学习了一下,挺简单的! 作用: 太多 还是复制一下把!!! CocoaPods是什么? ...
- Smart3D系列教程8之 《模型合并——相邻地区多次建模结果合并》
迄今为止,Wish3D已经出品推出了7篇系列教程,从倾斜摄影的原理方法.采集照片的技巧.Smart3D各模块的功能应用.小物件的照片重建.大区域的地形重建到DSM及正射影像的处理生产,立足于建模软件的 ...
- POJ3114 有些图缩点/改图/最短路
没想到手感还在~ 不须要又一次建图.仅仅要依据条件改改权值就可以. 还跑k次SPFA~ #include<cstdio> #include<iostream> #include ...
- AngularJS的表单验证提交示例
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularjsFormSubmit.rar 前台代码: <%@ page content ...
- 转 Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- 构建基于Javascript的移动web CMS——Hello,World
在一篇构建基于Javascript的移动web CMS入门--简单介绍中简单的介绍了关于墨颀CMS的一些原理,其极框架组成.于是開始接着应该说明一下这个CMS是怎样一步步搭建起来. RequireJS ...
- C语言函数的递归和调用
函数记住两点: (1)每个函数运行完才会返回调用它的函数:每个函数运行完才会返回调用它的函数,因此,你可以先看看这个函数不自我调用的条件,也就是fun()中if条件不成立的时候,对吧,不成立的时候就是 ...
- android IPC通信(上)-sharedUserId&&Messenger
看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...
- Dos下mySql
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...
- 总结一下vue调试的方法
1.最推荐使用的是vue的chrome插件: 2.平时开发中常用到的调试代码:console.log().alert():此外还有console.error()这个我用的比较少,感觉跟console. ...