首页 > 其他分享 >[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)

[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)

时间:2023-02-21 10:05:32浏览次数:41  
标签:Prime phi 1237 51Nod LL ret 杜教 int mod


题目描述

求题目分析

乍一看十分像裸莫比乌斯反演,然而[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演的范围让人望而却步
于是先变化一下式子
[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_02
枚举[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_#include_03
[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_04
令k=Td
[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_05
则此时可以整除分块优化,每次算出[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_06相等的上下界[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_07后用莫比乌斯反演计算[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_分块_08
由于计算[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_莫比乌斯反演_09的前缀和时记忆化处理过,所以在杜教筛外面再套了一个整除分块优化不会影响时间复杂度,复杂度仍是[51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)_#include_10

AC Code
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod = 1e9+7;
const int MAXN = 5e6+1;
const int inv2 = 500000004;
map<LL, LL> S; LL s[MAXN];
int Prime[MAXN], Cnt, phi[MAXN];
bool IsnotPrime[MAXN];

void init()
{
phi[1] = 1;
for(int i = 2; i < MAXN; ++i)
{
if(!IsnotPrime[i]) Prime[++Cnt] = i, phi[i] = i-1;
for(int j = 1; j <= Cnt && i * Prime[j] < MAXN; ++j)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0)
{
phi[i * Prime[j]] = phi[i] * Prime[j];
break;
}
phi[i * Prime[j]] = phi[i] * phi[Prime[j]];
}
}
for(int i = 1; i < MAXN; ++i) s[i] = (s[i-1] + phi[i]) % mod;
}

inline LL sum(LL n)
{
if(n < MAXN) return s[n];
if(S.count(n)) return S[n];
LL ret = (n%mod) * ((n+1)%mod) % mod * inv2 % mod;
for(LL i = 2, j; i <= n; i=j+1)
{
j = n/(n/i);
ret = (ret - sum(n/i) * ((j-i+1)%mod) % mod) % mod;
}
return S[n] = ret;
}

inline LL solve(LL n)
{
LL ret = 0;
for(LL i = 1, j; i <= n; i=j+1)
{
j = n/(n/i);
ret = (ret + ((n/i)%mod) * ((n/i)%mod) % mod * ((sum(j)-sum(i-1))%mod) % mod) % mod;
}
return ret;
}
int main ()
{
init(); LL n;
scanf("%lld", &n);
printf("%lld\n", (solve(n)+mod)%mod);
}


标签:Prime,phi,1237,51Nod,LL,ret,杜教,int,mod
From: https://blog.51cto.com/u_15973510/6075824

相关文章

  • [HDU 5608]Function(莫比乌斯反演 + 杜教筛)
    题目描述有求只有最多组数据题目分析如此一来就可以杜教筛了,然而仅仅这样还是会T,于是我们在想一想如何筛出前面一部分的值令,根据莫比乌斯反演于是用筛出前项就行了......
  • 力扣---1237. 找出给定方程的正整数解
    给你一个函数 f(x,y)和一个目标结果z,函数公式未知,请你计算方程f(x,y)==z所有可能的正整数数对x和y。满足条件的结果数对可以按任意顺序返回。尽管函数的具体......
  • 莫比乌斯反演与杜教筛
    莫比乌斯反演与杜教筛积性函数定义对于一个数论函数\(f\),若满足\(\forall(a,b)=1\)都有\(f(ab)=f(a)f(b)\),那么称\(f\)为积性函数。例子常见的积性函数有很多,......
  • 51NOD 1131 覆盖数字的数量 规律+公式
    1131覆盖数字的数量1.0秒 131,072.0KB 20分 ​​3级题​​给出一段从A-B的区间S(A,B为整数),这段区间内的整数可以随便使用任意次。再给出一段从X-Y的区间T,问用区间S......
  • 51NOD 1278 相离的圆(二分 + 排序 好题)
    平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。例如:4个圆分别位于1,2,3,4的位置,半径分别为1,1,2,1,那么{1,2},{1,3}{2,3}{2,4......
  • 51nod 2484 小b和排序(DP)
    小b有两个长度都为n的序列A,B。现在她需要选择一些i,然后交换A[i]和B[i],使得A和B都变成严格递增的序列。你能帮小b求出最少交换次数吗?输入保证有解。 收起输入第一行输入一......
  • 51nod 1428活动安排问题
    有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?  收起输入第一行一个正整数n(n<=10000)代表活动......
  • 51nod 1138 连续整数的和 好题
    给出一个正整数N,将N写为若干个连续数字和的形式(长度>=2)。例如N=15,可以写为1+2+3+4+5,也可以写为4+5+6,或7+8。如果不能写为若干个连续整数的和,则输出NoS......
  • 51nod 1095 Anigram单词
    1095Anigram单词一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。另:相同的2个单词不算Anigram。现在给定......
  • 51nod 1133 不重叠的线段
    X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[15][23][36],可以选[23][36],这2条线段互不重叠。 收......