【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 ...
随机推荐
- Arduino控制舵机
一.接线 舵机 Arduino GND GND +5V 5V PWN 10 其中信号线PWN接arduino上任意带波浪号的引脚都可,我这里选择的是10号引脚,注意在程序中绑定的引脚要和连接的引脚相同 ...
- MySQL整形手工注入
0x1 判断注入点: http://www.xxx.org/members.php?id=1 and 1=1 --+ # ture http://www.xxx.org/members.php?id= ...
- Qt背景不显示问题
背景不显示的只有主窗口会发生,原因是主窗口使用的QWidget类 解决办法 重构paintEvent事件,添加即可 void LoginWidget::paintEvent(QPaintEvent * ...
- Jenkins+gradle+git部署
感谢博友分享,这边记录下https://blog.csdn.net/jiankeufo/article/details/78228334 我的密码7789cc2b62114e9da9fb78b0aa3 ...
- JS高阶---闭包(循环遍历+监听)
大纲: 主体: (1)场景1:点击按钮显示点击的第几个 注意:伪数组每次循环时都会重新计算一次长度,所以最好提出去或者直接加到for循环内部 结果: 分析: 1.i为全局变量 解决方案: 1.下标法 ...
- HTML与CSS学习笔记(1)
1.web三大核心技术? HTML CSS JavaScript 2.HTML基本机构和属性 HTML:超文本 标记 语言 超文本:文本内容+非文本内容(图片.视频.音频等) 标记:<单词> ...
- day10_7.10 函数的嵌套等
一.命名关键字参数.(了解) 1.在函数阶段,写在*与** 可变长参数之间的形参称为命名关键字参数. 在给命名关键字参数传值时,只能用关键字为其传值.诸如以下函数的形参 def func(x,y=,* ...
- python27期尚哥讲并发编程:
python27day23并发编程----------------------------------------------------------------------------------- ...
- Python面向对象 | 鸭子方法
鸭子类型 如果看起来像.叫声像而且走起路来像鸭子,那么它就是鸭子’.python程序员通常根据这种行为来编写程序.例如,如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与 ...
- Spring IOC小记
1. What IOC (Inversion Of Control,控制反转)与DI(Dependency Injecion,依赖注入) 用于对象间解耦,如在以前若对象A依赖B则需要在A中负责B的创建 ...