序列变换

题目描述

\(lyk\) 有两序列 \(a\) 和 \(b\)。

\(lyk\) 想知道存在多少对 \(x,y\),满足以下两个条件。

\(1:\gcd(x,y)=1\)。

\(2:a_{b_x} = b_{a_y}\)。

例如若 \(a={1,1,1},b={1,1,1}\)。那么存在 \(7\) 对,因为除了 \(x=2,y=2\) 或 \(x=3,y=3\) 外都满足条件。

输入

第一行一个数 \(n(1<=n<=100000)\)。

接下来一行n个数,表示 \(ai(1<=ai<=n)\)。

接下来一行n个数,表示 \(bi(1<=bi<=n)\)。

输出

一行表示答案

输入样例

3

1 1 1

1 1 1

输出样例

7

解析

这是我第一次用莫比乌斯反演性质二的第一题

先打出莫比乌斯反演性质二:

有数论函数 \(f(n)= \sum_{d|n} g(d)\)

逆求 \(g(n)\)

则有:

\[g(n)=\sum_{d|n} f(d) \mu(\frac{n}{d})
\]

日后再证

然后套路解题

\[f(x) = \sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j)=x][a_{b_i} = b_{a_j}]
\]

再设

\[F(x)=\sum_{x|d} f(d)
\]

然后玩第二个式子

\[\begin{aligned}
F(x)
&=\sum_{x|d} f(d) \\
&=\sum_{x|d} \sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j)=d][a_{b_i} = b_{a_j}] \\
&=\sum_{i=1}^n \sum_{j=1}^n [x|gcd(i,j)][a_{b_i} = b_{a_j}] \\
&=\sum_{x|i} \sum_{x|j} [a_{b_i} = b_{a_j}]
\end{aligned}
\]

那么,答案就是:

\[f(1) = \sum_{i=1}^n F(i) \mu(i)
\]

求 \(f(1)\) 我们期望是 \(O(n)\)

所以我们要预处理出 \(\mu\) 和所有 \(F(i)\)

如何快速计算 \(F(i)\) ?

呵呵,先开个桶,然后~~~

看我代码吧,政治觉悟略高的同志必然能看得懂

代码

#include<cstdio>
using namespace std;
typedef long long LL; const int N = 1e5;
int a[N + 5] , b[N + 5] , n , mu[N + 5] , tot , prime[N + 5] , vis[N + 5];
LL cnt[N + 5] , F[N + 5] , ans; inline void getF()
{
for(register int i = 1; i <=n; i++)
{
for(register int j = i; j <= n; j += i) cnt[a[b[j]]]++;
for(register int j = i; j <= n; j += i) F[i] += cnt[b[a[j]]];
for(register int j = i; j <= n; j += i) cnt[a[b[j]]]--;
}
} inline void getmu()
{
mu[1] = 1;
for(register int i = 2; i <=n; i++)
{
if (!vis[i]) mu[prime[++tot] = i] = -1;
for(register int j = 1; j <= tot && prime[j] * i <= n; j++)
{
vis[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
mu[prime[j] * i] = -mu[i];
}
}
} int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]);
for(register int i = 1; i <= n; i++) scanf("%d" , &b[i]);
getF() , getmu();
for(register int i = 1; i <= n; i++) ans += (LL)mu[i] * F[i];
printf("%lld" , ans);
}

51nod 1675.序列变换的更多相关文章

  1. 51Nod 欢乐手速场1 B 序列变换[容斥原理 莫比乌斯函数]

    序列变换 alpq654321 (命题人)   基准时间限制:1 秒 空间限制:131072 KB 分值: 40 lyk有两序列a和b. lyk想知道存在多少对x,y,满足以下两个条件. 1:gcd( ...

  2. 51nod 1294 :修改数组 && HDU 5256:序列变换

    1294 修改数组 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 给出一个整数数组A,你可以将任何一个数修 ...

  3. 2015年百度之星初赛(1) --- C 序列变换

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 序列变换(hdu5248)

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 序列变换(Lis变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. hdu 5256 序列变换 (LIS变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. 51nod 1483 化学变换 | 二进制 暴力

    51nod 1483 化学变换 题面 给出n个整数(n <= 1e5,每个数 <= 1e5),对每个数都可以进行多次操作,操作有两种:乘二/整除以二. 问最少经过多少次操作能使所有数相等. ...

  8. LIS 2015百度之星初赛2 HDOJ 5256 序列变换

    题目传送门 题意:中文题面 分析:LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载)加入序列是1,2,2,2,3,这样求上升子序列是3,也就是 ...

  9. 二分搜索 2015百度之星初赛1 HDOJ 5248 序列变换

    题目传送门 /* 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 比赛时以为是贪心,榨干智商也想不出来:( ...

  10. luogu P3411 序列变换

    链接 P3411 序列变换 如果要最小化答案,那么就最大化不移动的数. 那么不移动的子序列一定是最后答案的一段连续区间,而移动的数我们是一定有办法把他们还原的. 设\(f_{i}\)表示\(i\)点的 ...

随机推荐

  1. day27 CSS浮动、溢出 & js基本语法 & DOM文档流操作

    接day26CSS=>CSS定位 overflow属性 值 描述 示例 visible 默认值,内容不会被修剪,会呈现在元素框之外 hidden 内容会被修剪,并且其余内容是不可见的 overf ...

  2. 打印九九乘法表,打印金字塔-java

    /** * *** ***** 打印如图金字塔 *=i*2-1 (竖)空格数=列数-1 */ public class Circulate{ public static void main(Strin ...

  3. 【基础语法规范】BC1:Hello Nowcoder

    语言1:Java public class Main{ public static void main(String[] args){ System.out.println("Hello N ...

  4. TypeScript 之 Interface

    Interface 描述:用来描述对象的形状,能够被继承 常用语法 ( Common Syntax ) 1. 描述普通对象 interface JsonResponse { version:numbe ...

  5. Window系统的mysql数据库定时备份

    原文:Window系统的mysql数据库定时备份 - Stars-One的杂货小窝 最近老大提到了数据库备份的功能,由于服务器是window系统的,所以研究了下备份的方案,特此记录 主要是实现每天定时 ...

  6. 【Java】【数据库】索引为何使查询变得更快?--B+树

    排序数据的二分查找 二分查找的时间复杂度是\(O(log_2n)\),明显快于暴力搜索. 索引 建立索引的数据,就是通过事先排好顺序,在查找时可以应用二分查找来提高查询效率. 所以索引应该尽可能建立在 ...

  7. 《MySQL必知必会》之快速入门游标和触发器

    第二十四章 使用游标 本章将介绍什么是游标以及如何使用游标 游标 之前的select语句检索出来的数据,没有办法得到第一行或者下一行 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原 ...

  8. 前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)

    本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文.响应报文.持久连接.缓存.Cookie 以及 HTTP 版本升级等! HTTP 协议全称为 HyperText Transfer Pr ...

  9. vue3+TS 自定义指令:长按触发绑定的函数

    vue3+TS 自定义指令:长按触发绑定的函数 而然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢. 编写自定义指令时遇到的几个难点 1.自定义指令的 ...

  10. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...