[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++

原文地址:https://www.cnblogs.com/wzc521/p/11621299.html

时间: 2024-10-03 09:36:58

[CSP-S模拟测试]:太阳神(莫比乌斯反演)的相关文章

[20191003机房测试] 太阳神

太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目 求满足如下条件的数对(a,b)对数: a,b 均为正整数且 a,b<=n 而lcm(a,b)>n 其中的 lcm 当然表示最小公倍数 答案对 1,000,000,007取模 数据范围是1e10的,打表找了半天规律发现没用-- 那就莫比乌斯反演呗 题目求: \[\sum_{i=1}^{n}\sum_{j=1}^{n}[lcm(i,j)> n]\] 但是大于的太多了,那我们就反过来求,最后用总的来减 也就是求: \[\sum_

csp-s模拟测试57(10.2)「天空龙」&#183;「巨神兵」&#183;「太阳神」

题目是古埃及神话??? A. 天空龙 傻逼模拟,看来没有滑天下之大稽QAQ,也没有打错快读(大雾...) B. 巨神兵 难度爆增,一脸懵比..... 60分状压: 因为是求有向图,关于有向图好像拓扑用的很多,考虑到每个图的拓扑序是一定的 那么我们可以借此转移,设f[i][j]为当前点的状态为i,出度为零的点的度数为j 向下一层转移时枚举下一层的点集,那么点集S中每个点一定要和j连边,可以和i中除j以外的点连边 然后对于每个点cnt1,表示除j以外与i的连边,cnt2表示与j的连边,该点的贡献为2

[jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 我们设$f(x)$表示最小循环节长度为x的合法序列数,那么有$ans=\sum_{d|gcd(n,m)}\frac{1}{d}f(d)$ 这是因为最小循环节为d的序列对应的环会被计算d次,比如 0101,最小循环节长度为 2(循环节为 01),其对应的环会被统计 2 次(序列 0101 与 1010)

算法学习——莫比乌斯反演(1)

.. 省选GG了,我果然还是太菜了.. 突然想讲莫比乌斯反演了 那就讲吧! 首先我们看一个等式-- (d|n表示d是n的约束) 然后呢,转换一下 于是,我们就发现! 没错!F的系数是有规律的! 规律is here! 公式: 这个有什么卵用呢? 假如说有一道题 F(n)可以很simple的求出来而求f(n)就比较difficult了,该怎么办呢? 然后就可以用上面的式子了 是莫比乌斯函数,十分有趣 定义如下: 若d=1,则=1 若d=p1*p2*p3...*pk,且pi为互异素数,则=(-1)^k

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

莫比乌斯反演介绍

转自:http://blog.csdn.net/acdreamers/article/details/8542292 莫比乌斯反演在数论中占有重要的地位,许多情况下能大大简化运算.那么我们先来认识莫比乌斯反演公式. 定理:和是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论 在上面的公式中有一个函数,它的定义如下: (1)若,那么 (2)若,均为互异素数,那么 (3)其它情况下 对于函数,它有如下的常见性质: (1)对任意正整数有 (2)对任意正整数有 1 void Init()

莫比乌斯反演 - HNU 13412 Cookie Counter

Cookie Counter Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13412&courseid=0 Mean: 将N分为D份,每份不超过X,有多少种分法? analyse: 莫比乌斯反演的运用. 首先我们想到的是迭代,但是数据太大,一路迭代下去必定爆栈+超内存+TLE. 那么就需要用莫比乌斯反演来优化多项式求和.我们枚举X,对于满足条件的X,使用莫比乌斯反演求和统计答案,不满足条

莫比乌斯反演(转)

http://www.cnblogs.com/AOQNRMGYXLMV/p/4065628.html 一.莫比乌斯(Möbius)函数 对于每个正整数n(n ≥ 2),设它的质因数分解式为: 根据这个式子定义n的莫比乌斯函数为: 也就是如果n有平方因子,则为0. 否则是-1的质因数个数次方. 举个简单的例子:6 = 2 × 3,所以:  9 = 3×3, 所以 [命题一] 对于正整数n有: 也就是n>2时,所有n的约数对应函数值之和为0. 证明: n=1的时候是显然的. n≥2时: ① 如果d中

【读书笔记】莫比乌斯函数与莫比乌斯反演

一.莫比乌斯(Möbius)函数 对于每个正整数n(n ≥ 2),设它的质因数分解式为: 根据这个式子定义n的莫比乌斯函数为: 也就是如果n有平方因子,则为0. 否则是-1的质因数个数次方. 举个简单的例子:6 = 2 × 3,所以:  9 = 3×3, 所以 [命题一] 对于正整数n有: 也就是n>2时,所有n的约数对应函数值之和为0. 证明: n=1的时候是显然的. n≥2时: ① 如果d中也含有平方因子,则其值为零. ② 设 , 若d中不含平方因子,则必有. 所以有: 得证. 二.欧拉函数