【Luogu5348】密码解锁(莫比乌斯反演,数论)
【Luogu5348】密码解锁(莫比乌斯反演,数论)
题面
题解
首先题目给定的限制是\(\sum_{n|i}a[i]=\mu(n)\),然后把这个东西反演一下,
莫比乌斯反演的式子是:\(g(n)=\sum_{n|i}f(i)\rightarrow f(n)=\sum_{n|i}g(i)\mu(\frac{i}{n})\),在这里\(\mu\)就是\(g\),而\(a\)就是\(f\)。
所以我们可以得到:\(a[m]=\sum_{m|i}\mu(i)\mu(\frac{i}{m})=\sum_{i=1}^{n/m}\mu(i)\mu(im)\)。
然后直接把后面拆开,得到:\(\mu(m)\sum_{i=1}^{n/m}[gcd(i,m)=1]\mu(i)^2\)
后面那一半接着拆,可以得到:
a[m]&=\mu(m)\sum_{i=1}^{n/m}\mu(i)^2\sum_{j|i,j|m}\mu(j)\\
&=\mu(m)\sum_{j|m}\mu(j)\sum_{j|i}^{n/m}\mu(i)^2
\end{aligned}\]
前面的\(j\)显然只有\(\sqrt m\) 个了。
后面一半枚举最小的平方因子,然后把这部分的贡献减去就行了,这部分的复杂度是\(O(\sqrt \frac{n}{m})\)。
所以总的复杂度就是\(O(\sigma_0(m)\sqrt{\frac{n}{m}})\)。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
ll n,ans;int m,fac[100],p;;
const int N=1e6;
bool zs[N];
int mu[N],pri[N],tot;
void Sieve()
{
mu[1]=1;
for(int i=2;i<N;++i)
{
if(!zs[i])pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<N;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j]==0)break;
mu[i*pri[j]]=-mu[i];
}
}
}
void Calc(int j,int v)
{
int nn=n/m/j,ret=0;
for(int i=1;i*i<=nn*j;++i)
{
int ii=i*i/__gcd(i*i,j);
ret+=nn/ii*mu[i];
}
ans+=v*ret;
}
void dfs(int x,int j,int mu)
{
if(x==p+1){Calc(j,mu);return;}
dfs(x+1,j,mu);
dfs(x+1,j*fac[x],-mu);
}
int main()
{
int T=read();Sieve();
while(T--)
{
n=read();m=read();p=ans=0;
int x=m;bool fl=false;
for(int i=2;i*i<=x;++i)
if(x%i==0)
{
int c=0;fac[++p]=i;
while(x%i==0)++c,x/=i;
if(c>1){fl=true;break;}
}
if(fl){puts("0");continue;}
if(x>1)fac[++p]=x;
dfs(1,1,1);
printf("%lld\n",ans*((p&1)?-1:1));
}
}
【Luogu5348】密码解锁(莫比乌斯反演,数论)的更多相关文章
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...
- 【BZOJ2820】YY的GCD(莫比乌斯反演 数论分块)
题目链接 大意 给定多组\(N\),\(M\),求\(1\le x\le N,1\le y\le M\)并且\(Gcd(x, y)\)为质数的\((x, y)\)有多少对. 思路 我们设\(f(i)\ ...
- 洛谷P3455 ZAP-Queries [POI2007] 莫比乌斯反演+数论分块
正解:莫比乌斯反演 解题报告: 传送门! 首先这题刚看到就很,莫比乌斯反演嘛,和我前面写了题解的那个一模一样的,所以这儿就不讲这前边的做法辣QAQ 但是这样儿还有个问题,就现在已知我每次都是要O(n) ...
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)
手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
- [计蒜客] tsy's number 解题报告 (莫比乌斯反演+数论分块)
interlinkage: https://nanti.jisuanke.com/t/38226 description: solution: 显然$\frac{\phi(j^2)}{\phi(j)} ...
- Luogu5348 密码解锁
题面 题解 记\(N = \dfrac nm\) 这道题目就是要求\(a_m = \sum_{i=1}^N \mu(i)\mu(im)\) 因为\(\mu(ij) = \mu(i)\mu(j)[\gc ...
随机推荐
- git did not exit cleanly (exit code 1) 的解决办法
问题描述: 关于Git的使用,在通常情况下,习惯于先在本地创建一个本地仓库,然后将项目提交到本地master,再将本地master中的项目Push 到远程仓库中,这样问题就来了. 具体错误信息如下: ...
- Java基础回顾——反射+案例
一,引言: 从大二刚开始接触java,了解其基本语法,到用swing编写图形界面的程序,到JavaWeb用SSH三大框架编写小网站,后面又学SSM,SpringBoot,SpringCloud等.可以 ...
- 困扰了2天的问题,终于解决了。VB6的MSComCtl.ocx在32位Win7显示对象库未注册
解决方案在这里,中文的资料真的挺垃圾的.(重启几次之后又不行了....怎么回事???) 安装.net framework4.0以上版本, C:\Windows\System32, C:\Windows ...
- 团队——Alpha2版本发布
这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求的链接 团队名称 杨荣模杰和他的佶祥虎 这个作业的目标 发布并说明产品Alpha2版本 一.团队成员的学号姓名列表 学号 姓名 201731 ...
- 石欣钰-201871010117 《面向对象程序设计(java)》第六、七周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- XSS-Stored
存储型XSS (持久性XSS) 将恶意JavaScript代码存储在数据库,当下次用户浏览的时候执行 Low <?php if( isset( $_POST[ 'btnSign' ] ) ) { ...
- Window包管理工具scoop
自定义安装路径安装 scoop安装应用路径 目标目录是D:\Program Files\Scoop,在PowerShell命令控制台中运行: [environment]::setEnvironment ...
- spring cloud fegin传递request header
本文链接:https://blog.csdn.net/zhongzunfa/article/details/82791903 1.概述 今天一个朋友, 遇到一个如何在使用spring cloud fe ...
- Java 函数式编程(Lambda表达式)与Stream API
1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...
- [LeetCode] 723. Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...