[CSP-S模拟测试]:太阳神(莫比乌斯反演)
题目描述
太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目。
求满足如下条件的数对$(a,b)$对数:$a,b$均为正整数且$a,b\leqslant n$而$lcm(a,b)>n$。其中的$lcm$当然表示最小公倍数。答案对$1,000,000,007$取模
输入格式
第一行一个正整数$n$。
输出格式
一行一个整数表示答案,对$1,000,000,007$取模。
样例
样例输入:
3
样例输出:
2
数据范围与提示
对于$20\%$的数据$n\leqslant 2,000$;
对于$40\%$的数据$n\leqslant 10,000,000$;
对于$60\%$的数据$n\leqslant 100,000,000$;
对于$80\%$的数据$n\leqslant 1,000,000,000$;
对于$100\%$的数据$n\leqslant 10,000,000,000$。
题解
一般遇到这种题,我们都是先将其化繁,再化简。
就是我们现有一个简,但是时间复杂度高的算法;然后将其化为一个繁,时间复杂度依然高的算法;再将这个算法化成一个既简单时间复杂度又低的算法。
那么我们先将其化繁,哦,不,先化简。
发现直接求$lcm(a,b)>n$很不好求,不妨求其补集,也就是$lca(a,b)<=n$。
开始化繁……
我们知道,$lcm(a,b)=\dfrac{a\times b}{gcd(a,b)}$,所以式子可以转化为:
$\sum \limits_{i=1}^n\sum \limits_{j=1}^n\dfrac{i\times j}{gcd(i,j)}\leqslant n$
将$gcd(i,j)$乘过去:
$=\sum \limits_{i=1}^n\sum \limits_{j=1}^ni\times j\leqslant gcd(i,j)\times n$
发现,我们可以枚举$gcd$,也就是:
$=\sum \limits_{g=1}^n\sum \limits_{i=1}^{\left \lfloor \dfrac{n}{g}\right \rfloor}\sum \limits_{j=1}^{\left \lfloor \dfrac{n}{g}\right \rfloor}i\times j\times g^2\leqslant g\times n\times [gcd(i,j)==1]$
约去一个$g$:
$=\sum \limits_{g=1}^n\sum \limits_{i=1}^{\left \lfloor \dfrac{n}{g}\right \rfloor}\sum \limits_{j=1}^{\left \lfloor \dfrac{n}{g}\right \rfloor}i\times j\times g\leqslant n\times [gcd(i,j)==1]$
遇到长这样的$gcd$我们一般考虑莫比乌斯反演。
那么我们又将其化成了:
$\sum\limits_{g=1}^n\sum\limits_{d=1}^{\left\lfloor\dfrac{n}{g}\right\rfloor}\mu (d)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{dg}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{n}{dg}\right\rfloor}i\times j\times g\times d^2\leqslant n$
因为我们再枚举$\left\lfloor\dfrac{n}{dg}\right\rfloor$以上是没有用的,所以我们可以将其变成:
$\sum \limits_{d=1}^{\sqrt{n}}\mu(d)\sum \limits_{g=1}^n\sum \limits_{i=1}^n\sum \limits_{j=1}^n i\times j\times g\leqslant \dfrac{n}{d^2}$
那么,我们可以设$i<j<g$,但是需要注意得数需要乘$6$;再设$i,j,g$中有两个相等,那么得数要乘$3$就好啦。
简略证明一下时间复杂度(不知道对不对):
我们在调用函数的时候最外层循环是$i\times i\times i\leqslant n$,内层循环是$i\times j\times j\leqslant n$,在平面直角坐标系上积分可以得到函数的时间复杂度是$\Theta({\frac{n}{i^2}}^{\frac{2}{3}})$,在考虑外面的$\Theta(n^{\frac{1}{2}})$即可得到总的时间复杂度是$\Theta(n^{\frac{2}{3}})$。
时间复杂度:$\Theta(n^{\frac{2}{3}})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long n;
int pri[100001],mu[100001],cnt;
bool v[100001];
long long ans;
void pre_work()
{
mu[1]=1;
for(long long i=2;i<=100000;i++)
{
if(!v[i])mu[pri[++cnt]=i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<=100000;j++)
{
v[i*pri[j]]=1;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else{mu[i*pri[j]]=0;break;}
}
}
}
long long get(long long x)
{
long long res=0;
for(long long i=1;i*i*i<=x;i++)
{
if(i*i*i<=x)res++;
for(long long j=i+1;i*j*j<x;j++)
res=(res+6*(x/i/j-j)%mod)%mod;
}
for(long long i=1;i*i<=x;i++)
res=(res+3*(x/i/i-(x/i/i>=i))%mod)%mod;
return res;
}
int main()
{
pre_work();
scanf("%lld",&n);
for(long long i=1;i*i<=n;i++)
if(mu[i])ans=(ans+mu[i]*get(n/i/i)%mod)%mod;
n%=mod;
printf("%lld",(n*n-ans+mod)%mod);
return 0;
}
rp++
[CSP-S模拟测试]:太阳神(莫比乌斯反演)的更多相关文章
- [CSP-S模拟测试]:gcd(莫比乌斯反演)
题目描述 有$n$个正整数$x_1\sim x_n$,初始时状态均为未选.有$m$个操作,每个操作给定一个编号$i$,将$x_i$的选取状态取反.每次操作后,你需要求出选取的数中有多少个互质的无序数对 ...
- [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)
题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...
- csps模拟测试57
T1 天空龙 大神题,考察多方面知识,例如:快读 附上考试代码,以供后人学习 应某迪要求,我决定多写一点. 正如文化课有知识性失分和非知识性失分一样,OI也同样存在. 但非知识性失分往往比知识性失分更 ...
- csp-s模拟测试57(10.2)「天空龙」·「巨神兵」·「太阳神」
题目是古埃及神话??? A. 天空龙 傻逼模拟,看来没有滑天下之大稽QAQ,也没有打错快读(大雾...) B. 巨神兵 难度爆增,一脸懵比..... 60分状压: 因为是求有向图,关于有向图好像拓扑用 ...
- 7.12 NOI模拟赛 积性函数求和 数论基础变换 莫比乌斯反演
神题! 一眼powerful number 复习了一下+推半天. 可以发现G函数只能为\(\sum_{d}[d|x]d\) 不断的推 可以发现最后需要求很多块G函数的前缀和 发现只有\(\sqrt(n ...
- [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)
题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...
- ACM学习历程—HYSBZ 2818 Gcd(欧拉函数 || 莫比乌斯反演)
Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2371 Solved: 1143[Submit][Sta ...
随机推荐
- Android Bitmap变迁与原理解析(4.x-8.x)
App开发不可避免的要和图片打交道,由于其占用内存非常大,管理不当很容易导致内存不足,最后OOM,图片的背后其实是Bitmap,它是Android中最能吃内存的对象之一,也是很多OOM的元凶,不过,在 ...
- st.getParameter() 和request.getAttribute() 区别 https://terryjs.iteye.com/blog/1317610
getParameter 是用来接受用post个get方法传递过来的参数的.getAttribute 必须先setAttribute. (1)request.getParameter() 取得是通过容 ...
- Shell脚本中单引号(‘)和双引号(“)的使用区别
在Linux操作系统上编写Shell脚本时候,我们是在变量的前面使用$符号来获取该变量的值,通常在脚本中使用”$param”这种带双引号的格式,但也有出现使用'$param'这种带引号的使用的场景,首 ...
- IQueryable在LINQ中
IQueryable接口定义如下: // 摘要: // 提供对未指定数据类型的特定数据源的查询进行计算的功能. public interface IQueryable : IEnumerable { ...
- nginx 配置总结
可以选择在http{ }中设置:client_max_body_size 20m; 也可以选择在server{ }中设置:client_max_body_size 20m; 还可以选择在locatio ...
- [Python3 填坑] 018 组装类的几个例子
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 MetaClass 举例 2.2 type 举例 2.3 MetaClass 举例 1. print( 坑的信息 ) 挖坑时间:2019 ...
- WOJ#3836 Sightseeing Trip
描述 给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可. ...
- 小白学Python(16)——pyecharts 绘制地理图表 Geo
Geo-基本示例 from example.commons import Faker from pyecharts import options as opts from pyecharts.char ...
- XE2再次安装JVCL
说再次安装,是因为我忘了自己之前写过的方法,装完之后感觉怪怪的,想看看别人是怎么装的,于是用google搜索了一下,才发现之前写过: http://www.cnblogs.com/findumars/ ...
- wikioi 2144 分步二进制枚举+map记录
题目描写叙述 Description 有n个砝码,如今要称一个质量为m的物体,请问最少须要挑出几个砝码来称? 注意一个砝码最多仅仅能挑一次 输入描写叙述 Input Description 第一行两个 ...