机房测试3:太阳神 ra (莫比乌斯反演)

题目:

分析:
(终于在yyr大佬的援助下弄懂了这道题。。。)

首先lcm>n的限制太少,不好直接处理,转换成求补集,也就是lcm<=n,最后用n^n-ans即可。

考虑怎么求lcm<=n:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100005
#define ri register int
const ll mod=1e9+7;
int mu[N],lim,pri[N],su[N],cnt=0;
void init()
{
    mu[1]=1;
    for(ri i=2;i<=lim;++i){
        if(!pri[i]) mu[i]=-1,su[++cnt]=i;
        for(ri j=1;j<=cnt&&i*su[j]<=lim;++j){
            pri[i*su[j]]=1;
            if(i%su[j]==0) { mu[i*su[j]]=0; break; }
            else mu[i*su[j]]=-mu[i];
        }
    }
}
int main()
{
    freopen("ra.in","r",stdin);
    freopen("ra.out","w",stdout);
    ll n;
    scanf("%lld",&n);
    lim=(int)(sqrt(n)+0.5);
    init();
    ll anss=0;
    for(ri d=1;d<=lim;++d){
        ll tmp=n/d/d,ans=0;
        for(ll a=1;a*a*a<=tmp;++a)//在极小的范围里面枚举a和b 就可以得到c的范围
         for(ll b=a;b*b<=tmp/a;++b){
             ll c=tmp/a/b-b;//注意c是统计的范围
             if(a==b) ans=( ans + 1 + c*3 ) %mod;
             else ans=( ans + 3 + c*6 ) %mod;
        }
        anss=( anss + mu[d]*ans )%mod;
    }
    n%=mod;
    printf("%lld\n",(n*n%mod-anss+mod)%mod);
}

原文地址:https://www.cnblogs.com/mowanying/p/11623314.html

时间: 2024-09-29 18:48:39

机房测试3:太阳神 ra (莫比乌斯反演)的相关文章

[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$:对

浅谈算法——莫比乌斯反演

前言 莫比乌斯反演(又称懵逼钨丝繁衍),那种让人看了就懵逼的东西(其实是我太菜了) 莫比乌斯反演在知道之后对解题十分有帮助,\(O(n)\)的柿子分分钟化成\(O(\sqrt n)\) 那么,什么是莫比乌斯反演呢? 莫比乌斯反演 1.莫比乌斯反演 如果说,有\(f(n)\)和\(g(n)\)是定义在正整数集合上的两个函数,并且满足 \[f(n)=\sum\limits_{d|n} g(d)\] 那么就有 \[g(n)=\sum\limits_{d|n} f(\dfrac{n}{d})\times

[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

算法学习——莫比乌斯反演(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

莫比乌斯反演介绍

转自: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中不含平方因子,则必有. 所以有: 得证. 二.欧拉函数