51Nod 2026 Gcd and Lcm
题目传送门
分析:
开始玩一个小小的trick
我们发现\(f(n)=\sum_{d|n}\mu(d)\cdot d\)是一个积性函数
所以:
\(~~~~f(n)=\prod f(p_i^{a_i})\)
\(~~~~f(gcd(x,y))\cdot f(lcm(x,y))=\prod f(p_i^{min(a_i,b_i)})\cdot f(p_i^{max(a_i,b_i)})\)
可以疯狂使用交换律然后。。。
\(~~~~\prod f(p_i^{min(a_i,b_i)})\cdot f(p_i^{max(a_i,b_i)})=f(x)\cdot f(y)\)
接下来就好办了,大力推:
\(~~~~\sum_{i=1}^{n}\sum_{j=1}^{n}f(gcd(i,j))\cdot f(lcm(i,j))\)
\(=\sum_{i=1}^{n}\sum_{j=1}^{n}f(i)\cdot f(j)\)
\(=(\sum_{i=1}^{n}f(i))^2\)
我们求里面的:
\(~~~~\sum_{i=1}^{n}\sum_{d|i}\mu(d)\cdot d\)
\(=\sum_{d=1}^{n}\mu(d)\cdot d\cdot \lfloor\frac{n}{d}\rfloor\)
分块处理\(\lfloor\frac{n}{d}\rfloor\)
后面的老套路,卷一个\(Id\)
\(~~~~\sum_{i=1}^{n}\sum_{d|i}\mu(d)\cdot d\cdot \frac{i}{d}=\sum_{i=1}^{n}i\sum_{d|i}\mu(d)=1\)
\(=\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)\cdot i\)
把\(d=1\)提出来:
\(~~~~\sum_{i=1}^{n}\mu(i)\cdot i=1-\sum_{d=2}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)\cdot i\)
\(~~~~S(n)=1-\sum_{d=2}^{n}d\cdot S(\lfloor\frac{n}{d}\rfloor)\)
然后杜教筛就好了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<string>
#define maxn 100005
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define inv2 500000004
using namespace std;
inline long long getint()
{
    long long num=0,flag=1;char c;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
    while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
    return num*flag;
}
long long N;
long long pri[maxn],cnt,np[maxn],mu[maxn];
long long ans;
map<long long,long long>M;
inline void init()
{
	mu[1]=1;
	for(int i=2;i<maxn;i++)
	{
		if(!np[i])pri[++cnt]=i,mu[i]=-1;
		for(int j=1;j<=cnt&&i*pri[j]<maxn;j++)
		{
			np[i*pri[j]]=1;
			if(i%pri[j]==0)break;
			mu[i*pri[j]]=-mu[i];
		}
	}
	for(int i=1;i<maxn;i++)(mu[i]*=i)%=MOD;
	for(int i=1;i<maxn;i++)(mu[i]+=mu[i-1])%=MOD;
}
inline long long getans(long long x)
{
	if(x<maxn)return mu[x];
	if(M.count(x))return M[x];
	long long num=1;
	for(long long i=2,j;i<=x;i=j+1)
	{
		j=x/(x/i);
		(num+=MOD-(i+j)*(j-i+1)%MOD*inv2%MOD*getans(x/i))%=MOD;
	}
	return M[x]=num;
}
int main()
{
	N=getint();
	init();
	for(long long i=1,j;i<=N;i=j+1)
	{
		j=N/(N/i);
		(ans+=(N/i)*(getans(j)-getans(i-1)))%=MOD;
	}
	printf("%lld\n",(ans*ans%MOD+MOD)%MOD);
}

51Nod 2026 Gcd and Lcm的更多相关文章
- 【51nod】2026 Gcd and Lcm
		题解 话说LOJ说我今天宜学数论= =看到小迪学了杜教筛去蹭了一波小迪做的题 标解的杜教筛的函数不懂啊,怎么推的毫无思路= = 所以写了个复杂度稍微高一点的?? 首先,我们发现f是个积性函数,那么我们 ... 
- 51nod 1575 Gcd and Lcm
		题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1575 万年巨坑终于填掉了…… 首先是煞笔西瓜的做题历程O_O. ... 
- HDOJ 4497 GCD and LCM
		组合数学 GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ... 
- hdu 4497 GCD and LCM 数学
		GCD and LCM Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4 ... 
- GCD 与 LCM UVA - 11388
		题目链接: https://cn.vjudge.net/problem/23709/origin 本题其实有坑 数据大小太大, 2的32次方,故而一定是取巧的算法,暴力不可能过的 思路是最大公因数的倍 ... 
- 简单数论总结1——gcd与lcm
		并不重要的前言 最近学习了一些数论知识,但是自己都不懂自己到底学了些什么qwq,在这里把知识一并总结起来. 也不是很难的gcd和lcm 显而易见的结论: 为什么呢? 根据唯一分解定理: a和b都可被分 ... 
- poj 2429 GCD & LCM Inverse 【java】+【数学】
		GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9928 Accepted: ... 
- HDU 4497 GCD and LCM (合数分解)
		GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ... 
- hdu4497 GCD and LCM
		GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ... 
随机推荐
- vue中的时间修饰符stop,self
			stop阻止自身以外的冒泡 self只会阻止自身冒泡 
- 【hdu 1849】Rabbit and Grass
			Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ... 
- URL参数中加号“+”丢失的问题
			Java解决方法(推荐) URLEncoder.encode(urlParams,"UTF-8"); 
- FreeNOS学习3——了解目录结构和Main函数
			下载源码的文件夹,看到里面有以下内容: 解释一下里面都有啥 lib -> 共享代码 1.libfs 文件系统(磁盘管理) 2.liballoc 内存分配和虚拟内存映射(内存管理) 3.libex ... 
- MySQL基础篇(03):系统和自定义函数总结,触发器使用详解
			本文源码:GitHub·点这里 || GitEE·点这里 一.系统封装函数 MySQL 有很多内置的函数,可以快速解决开发中的一些业务需求,大概包括流程控制函数,数值型函数.字符串型函数.日期时间函数 ... 
- 雪花算法 Snowflake & Sonyflake
			唯一ID算法Snowflake相信大家都不墨生,他是Twitter公司提出来的算法.非常广泛的应用在各种业务系统里.也因为Snowflake的灵活性和缺点,对他的改造层出不穷,比百度的UidGener ... 
- Ubuntu查看cuda和cudnn版本
			查看 CUDA 版本: cat /usr/local/cuda/version.txt 查看 CUDNN 版本: cat /usr/local/cuda/include/cudnn.h | grep ... 
- 纯css 实现大白
			首先是用html 语言来搭建框架 <!DOCTYPE html> <html lang="en"> <head> <meta charse ... 
- 更换EMC VNX系列存储故障硬盘的检查步骤
			更换EMC VNX系列存储故障硬盘的检查步骤 VNX1代(VNX5300,VNX5500,VNX5700,VNX7500和VNX2代(VNX5400,5600,5800和VNX7600,8000)有区 ... 
- java 实现敏感词(sensitive word)工具详解使用说明
			sensitive-word 平时工作中,只要涉及到用户可以自由发言(博客.文档.论坛),就要考虑内容的敏感性处理. sensitive-word 基于 DFA 算法实现的高性能敏感词工具.工具使用 ... 
