【洛谷】P5348 密码解锁

很显然我们可以推导出这个式子

设\(a(m)\)为\(m\)位置的值

\[\mu(m) = \sum_{m | d} a(d) \\
a(m) = \sum_{m|d}\mu(\frac{d}{m})\mu(d) \\
a(m) = \sum_{i = 1}^{\lfloor \frac{n}{m} \rfloor} \mu(i)\mu(im) \\
a(m) = \mu(m) \sum_{i = 1}^{\lfloor \frac{n}{m} \rfloor} \mu(i)^{2}[gcd(m,i) == 1]
\]

而\(\mu(i)^{2}\)的本质是无平方因子数,这个可以容斥

容斥的方法是(若没有其他限制)

\[ans = \sum_{i = 1}^{\sqrt{N}} \mu(i)\lfloor \frac{N}{i^{2}}\rfloor
\]

那么这里的就是

\[ans = \sum_{i = 1}^{\sqrt{N / M}} [gcd(i,m) == 1]\mu(i)\sum_{j = 1}^{\lfloor \frac{N}{i ^ 2} \rfloor} [gcd(j,m) == 1]
\]

前面的互质可以直接枚举

后面的互质可以通过莫比乌斯反演外加预处理M中莫比乌斯值不为0的数算出来

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int64 N,MAXV;
int M,mu[1000005];
int prime[1000005],tot;
bool nonprime[1000005];
vector<pii > division;
int gcd(int a,int b) {
return b == 0 ? a : gcd(b,a % b);
}
int Mu(int x) {
if(x <= 1000000) return mu[x];
int res = 1;
for(int i = 2 ; i <= x / i ; ++i) {
if(x % i == 0) {
int c = 0;
while(x % i == 0) {x /= i;++c;}
if(c >= 2) return 0;
res = -res;
}
}
if(x != 1) res = -res;
return res;
}
int64 calc(int64 n) {
int64 res = 0;
for(auto t : division) {
if(n < t.fi) break;
res += 1LL * t.se * (n / t.fi);
}
return res;
}
void Init() {
mu[1] = 1;
for(int i = 2 ; i <= 1000000 ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
mu[i] = -1;
}
for(int j = 1 ; j <= tot ; ++j) {
if(prime[j] > 1000000 / i) break;
nonprime[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
else mu[i * prime[j]] = -mu[i];
}
}
}
void Solve() {
read(N);read(M);
if(Mu(M) == 0) {puts("0");return;}
division.clear();
for(int i = 1 ; i <= M / i ; ++i) {
if(M % i == 0) {
int j = M / i;
int x = Mu(i),y = Mu(j);
if(x) division.pb(mp(i,x));
if(i != j && y) division.pb(mp(j,y));
}
}
sort(division.begin(),division.end());
int64 T = N / M,res = 0;
for(int i = 1 ; i <= T / i ; ++i) {
if(gcd(i,M) == 1) {
res += Mu(i) * calc(T / (i * i));
}
}
res = res * Mu(M);
out(res);enter;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
int T;
read(T);
for(int i = 1 ; i <= T ; ++i) Solve();
}

【洛谷】P5348 密码解锁的更多相关文章

  1. 洛谷T8116 密码

    T8116 密码 题目描述 YJC把核弹发射密码忘掉了……其实是密码被加密了,但是YJC不会解密.密码由n个数字组成,第i个数字被加密成了如下形式:第k小的满足(2^L)|(P-1)且P为质数的P.Y ...

  2. 洛谷T90444 密码 题解

    [问题描述] 假发通过了不懈的努力,得到了将军家门锁的密码(一串小写英文字母).但是假发被十四和猩猩他们盯上了,所以假发需要把密码传递出去.因为假发不想十四他们发现几松门前贴的小纸条就是将军家的密码, ...

  3. [P5348]密码解锁

    Description 给一个长度为 \(n\) 的数组 \(a[1\dots n]\) ,满足 \(\sum_{m|x}a[x] = \mu(m)\),求 \(a[m]\). \(n\le 10^{ ...

  4. 洛谷 U6850 手机密码

    U6850 手机密码 题目背景 小明的手机上设了一个由四个数字组成的密码,但是小明自己的记性不好,但又不想把密码直接记在纸上,于是便想了一个方法. 题目描述 小明有四行数字,每行数字都有n[i](&l ...

  5. 洛谷 P1703 那个什么密码2

    P1703 那个什么密码2 题目背景 https://www.luogu.org/problem/show?pid=1079 题目描述 与原题一模一样.具体不同请见输入格式 输入输出格式 输入格式: ...

  6. 【Luogu5348】密码解锁(莫比乌斯反演,数论)

    [Luogu5348]密码解锁(莫比乌斯反演,数论) 题面 洛谷 题解 首先题目给定的限制是\(\sum_{n|i}a[i]=\mu(n)\),然后把这个东西反演一下, 莫比乌斯反演的式子是:\(g( ...

  7. [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍

    本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...

  8. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  9. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

随机推荐

  1. 安装更新npm和nodejs

    1.安装npm sudo apt-get install npm 2.升级npm sudo npm install npm@latest -g 3.安装用于安装nodejs的模块n sudo npm ...

  2. Android原生编解码接口 MediaCodec 之——踩坑

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gb702250823/article/d ...

  3. 内存管理2-set方法的内存管理

    1.对象之间的内存管理: 每个学生都有一本书 book类 @price 学生类  @age @book -------------------- #import "book.h" ...

  4. Selenium高亮显示定位到的元素

    在调试Selenium脚本中,有时因为操作太快或操作不明显而不清楚是否定位到了正确的元素.我们可用通过执行js为定位到的元素添加样式,来高亮显示定位到的元素. 在Selenim Webdriver中, ...

  5. String 类型的数据强转成int的方法

        有2个方法:1). int i = Integer.parseInt(str); 2). int i = Integer.valueOf(str).intValue();

  6. Mac 内存清理

    1.清理前后的对比 清理前: 清理后: 内存多了20G 2.思路 首先,我先看了很多人的经验贴,按照他们的路子查到最后,并没有找到他们指出的大文件. 很显然,Mac的使用方式不同,其内存分配肯定也会不 ...

  7. 客户端配置代理服务实现yum上外网

    vi  /etc/profile http_proxy=http://172.20.188.193:3128/https_proxy=https://172.20.188.193:3128/expor ...

  8. eclipse远程连接hadoop单机模式出现的问题

    按照http://tydldd.iteye.com/blog/2007938配置单机模式 主要是 (1)配置hadoop-env.sh,指定jdk的安装路径 添加jdk路径 # The java im ...

  9. MySql数据库的下载和安装卸载

    下载:到mysql官网下载 卸载 1.找到mysql安装目录下的my.ini文件 2.找到配置项datadir datadir="D:/develop /MySQL/MySQL Server ...

  10. MySQL 慢查询日志介绍

    转: MySQL 慢查询日志介绍 2018年08月23日 08:47:40 曾梦想仗剑走天涯XX 阅读数 1104   一. 慢查询介绍 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记 ...