题目描述

艾利欧在她的被子上发现了一个数字 NNN,他觉得只要找出最小的 xxx 使得 φx(N)=1\varphi^x(N)=1φx(N)=1 根据这个 xxx 她就能找到曾经绑架她的外星人的线索了。
当然她不会算,请你帮助她算出最小的 xxx。

输入格式

第一行一个正整数 TTT
接下来 TTT 组数据每组数据第一行一个正整数 mmm
接下来 mmm 行每行两个正整数 pi,qip_i,q_ipi​,qi​
其中 ∏i=1mpiqi\prod_{i=1}^m p_i ^ {q_i}∏i=1m​piqi​​ 为 NNN 的标准分解形式

输出格式

输出 TTT 行,每行一个整数,表示答案

输入样例

1
2
2 2
3 1

输出样例

3

解释/提示

φ(12)=4φ(4)=2φ(2)=1\varphi(12)=4 \\ \varphi(4)=2 \\ \varphi(2)=1 \\ φ(12)=4φ(4)=2φ(2)=1
所以答案是 333。
φ(∏i=1mpiqi)=∏i=1m(pi−1)piqi−1\varphi(\prod_{i=1}^m p_i^{q_i})=\prod_{i=1}^m(p_i-1)p_i^{q_i-1} φ(i=1∏m​piqi​​)=i=1∏m​(pi​−1)piqi​−1​

数据规模

对于全部的数据 1≤T≤50,1≤m≤2000,2≤pi≤105,1≤qi≤1091 \leq T \le 50,1 \leq m \leq 2000,2 \leq p_i \le 10^5,1 \le q_i \le 10^91≤T≤50,1≤m≤2000,2≤pi​≤105,1≤qi​≤109。

题目分析

首先先解释一个概念。
我们知道,φ(n)x=∏i=1xφ(n)\varphi(n)^x = \prod_{i=1}^{x} \varphi(n)φ(n)x=∏i=1x​φ(n),那么 φx(n)\varphi^x(n)φx(n) 又表示什么呢?
其实这表示的是函数的嵌套,例如,φ3(n)=φ(φ(φ(n)))\varphi^3(n) = \varphi(\varphi(\varphi(n)))φ3(n)=φ(φ(φ(n))),φ2(x)=φ(φ(x))\varphi^2(x) = \varphi(\varphi(x))φ2(x)=φ(φ(x))。
于是我们终于可以开始做这道题了——


经过蒟蒻的仔细的分析和观察发现,这道题很明显就是一道结论题 (当然结论是什么我也不知道)。于是,我们便可以先从打表开始。

  • 首先看 8=238 = 2^38=23:
    φ(8)=(2−1)×22=4φ(4)=(2−1)×21=2φ(2)=(2−1)×20=1\varphi(8) = (2 - 1) \times 2^2 = 4 \\ \varphi(4) = (2 - 1) \times 2 ^ 1 = 2 \\ \varphi(2) = (2 - 1) \times 2 ^ 0 = 1 \\ φ(8)=(2−1)×22=4φ(4)=(2−1)×21=2φ(2)=(2−1)×20=1
  • 不难看出,每次我们都将 222 的幂次项消掉了一个 222(22→21→202^2 \rightarrow 2^1 \rightarrow 2^022→21→20)。而 888 的 222 次项有 333 个,所以理所当然三次便可到达 111。
  • 那如果不只有 222 这个项呢?例如 18=21×3218 = 2^1 \times 3 ^ 218=21×32:
    φ(18)=(2−1)×20×(3−1)×31=6φ(6)=(2−1)×20×(3−1)×30=2φ(2)=(2−1)×20=1\varphi(18) = (2 - 1) \times 2^0 \times (3 - 1) \times 3^1 = 6 \\ \varphi(6) = (2 - 1) \times 2^0 \times (3 - 1) \times 3^0 = 2 \\ \varphi(2) = (2 - 1) \times 2 ^ 0 = 1 \\ φ(18)=(2−1)×20×(3−1)×31=6φ(6)=(2−1)×20×(3−1)×30=2φ(2)=(2−1)×20=1
  • 这里,虽然 222 这个项的指数为 111,但是仍需要 333 次才能变为 111。因为每一次,333 这个项都会分裂出一个 222(32→2×31,31→2×303^2 \rightarrow 2 \times 3^1, 3^1 \rightarrow 2 \times 3^032→2×31,31→2×30),而 333 这个项的指数又为 222,会多出来两个 222,所以需要 2+1=32 + 1 = 32+1=3 次才能变成 111。

发现了什么?我们最终所要求的答案 xxx,与该数每个质因子所能分裂出来的 222 的数量有关。这里不妨假设数 iii 会分裂出 dpidp_idpi​ 个 222,接下来就是要求解 dpdpdp 的递推式了。

  • 不难想到,如果是 iii 质数,那么下一步就会分裂出一个 i−1i - 1i−1,即 dpi=dpi−1dp_i = dp_{i - 1}dpi​=dpi−1​。
  • 如果 iii 是合数呢?我们假设 iii 为 666,因为 6=2×36 = 2 \times 36=2×3,所以 666 能分裂出的个数就应该是 222 所能分裂出的个数 + 333 所能分裂出的个数,即 dp6=dp2+dp3dp_6 = dp_2 + dp_3dp6​=dp2​+dp3​。
  • 推广一下,若 iii 是合数,那么 dpi=dpa+dpb,(1<a,b<n,a×b=n)dp_i = dp_a + dp_b, (1 < a, b < n, a \times b = n)dpi​=dpa​+dpb​,(1<a,b<n,a×b=n)。
  • 不难发现,如果使得上式的 aaa 等于 iii 的最小质因子,就可以使用欧拉筛来求解了。

最后,对于每个输入的 pip_ipi​,只要将 dppi×qidp_{p_i} \times q_idppi​​×qi​ 的值全部加起来即可得到答案。但其实,这样做并不完全正确,例如 15=31×5115 = 3^1 \times 5^115=31×51:
φ(15)=(3−1)×30×(5−1)×50=8φ(8)=(2−1)×22=4φ(4)=(2−1)×21=2φ(2)=(2−1)×20=1\varphi(15) = (3 - 1) \times 3^0 \times (5 - 1) \times 5^0 = 8 \\ \varphi(8) = (2 - 1) \times 2^2 = 4 \\ \varphi(4) = (2 - 1) \times 2 ^ 1 = 2 \\ \varphi(2) = (2 - 1) \times 2 ^ 0 = 1 \\ φ(15)=(3−1)×30×(5−1)×50=8φ(8)=(2−1)×22=4φ(4)=(2−1)×21=2φ(2)=(2−1)×20=1

  • 如果我们用刚才的方法计算,即 dp3×1+dp5×1dp_3 \times 1 + dp_5 \times 1dp3​×1+dp5​×1,得到的结果就是 1×1+2×1=31 \times 1 + 2 \times 1 = 31×1+2×1=3 次,但实际需要 444 次。这是因为,一开始 151515 的因子里没有 222,第一步没有办法消掉一个 222,只有当下一步 333 和 555 分裂出来 222 是才能开始消掉。
  • 因此,最后答案只需要 +1+1+1 即可。

AC代码

#include <bits/stdc++.h>
using namespace std;
long long T, n, pos, primes[100005], dp[100005];
bool nPrime[100005];void euler()
{dp[1] = 1; // 先初始化dp[1],方便更新dp[2]for (int i = 2; i <= 1e5; i++){if (!nPrime[i])primes[++pos] = i, dp[i] = dp[i - 1]; // 如果是质数,dp[i] = dp[i - 1]for (int j = 1; j <= pos && i * primes[j] <= 1e5; j++){nPrime[i * primes[j]] = true;dp[i * primes[j]] = dp[i] + dp[primes[j]]; // 如果是合数,dp[i] = dp[i的最小质因子] + dp[i / i的最小质因子]if (i % primes[j] == 0)break;}}
}int main()
{euler();scanf("%lld", &T);while (T--){scanf("%lld", &n);long long ans = 0, f = 1;for (int i = 1; i <= n; i++){long long p, q;scanf("%lld %lld", &p, &q);if (p == 2) // 判断有没有质因子2f = 0;ans += dp[p] * q;}printf("%lld\n", ans + f);}return 0;
}

好了,那么本期博客就到这里,如果哪里有问题,还请各位大佬多多指教。
另外,觉得写得好的话,还可以点赞 + 收藏哦 ^⌣^\hat{}\smile\hat{}^⌣^

[HAOI2012]外星人——数论欧拉函数相关推荐

  1. hdu1395 数论 欧拉函数

    hdu1395 数论   欧拉函数 对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解 2.如果是奇数 首先根据欧拉定理 我们可知 p ...

  2. 第二十六章 数论——欧拉函数(详解与证明)

    第二十六章 数论--欧拉函数(详解与证明) 欧拉函数 1.互质 2.欧拉函数的定义 3.欧拉函数的公式 4.欧拉函数的证明 5.欧拉函数的使用 (1)问题一: 思路 代码 (2)问题二: 思路 cas ...

  3. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛

    F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...

  4. 费马定理中值定理_数论-欧拉函数、欧拉定理

    欧拉函数 积性函数 满足 ( 互质) 定义 对于正整数 ,欧拉函数是小于等于 的所有数中与 互质的数的 个数. 欧拉函数是积性函数(这个证明不是很显然,这个链接里面有很多种证明方法) 记作: 公式 , ...

  5. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  6. nssl1232-函数【数论,欧拉函数,莫比乌斯反演】

    正题 题目大意 ∑d∣nf(d)=n\sum_{d|n}f(d)=nd∣n∑​f(d)=n 对于n个aia_iai​ 求 ∑i=1nf(ai)\sum_{i=1}^nf(a_i)i=1∑n​f(ai​ ...

  7. 数论 —— 欧拉函数

    [定义] 对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作: 例如:,因为 1.3.5.7 均与 8 互质. [性质] 1)若 n 为一素数 p,则: 2)若 n 为一素数 p ...

  8. [数论-欧拉函数的应用]NEFU 1115

    description 在高数课上老师给出了一个等式GCD(n-a,n)*GCD(n-b,n)=n^k; 已知,n,k,问同学们有多少组(a,b)满足这个等式.结果对10^9+7取模. 1<=a ...

  9. P2303 [SDOI2012] Longge(数论/欧拉函数)

    P2303 [SDOI2012] Longge 一道看似非常基础的数论题,但是蕴含了非常多的知识,求解 ∑i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n) i=1∑n​gcd(i,n) ...

最新文章

  1. ThinkPad L412 安装Mac 10.7.2 显卡驱动安装成功
  2. leetcode算法题--石子游戏 II★★
  3. VS2008编译汇编程序的问题
  4. 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动
  5. 【Network】高性能 UDP 服务应该怎么搞?
  6. HTTP协议中返回代码302的情况
  7. [转载]Flex 2.0 实现SWF全屏
  8. matlab中设置拟合初值,如何确定自定义函数拟合时的参数初值?
  9. Python使用datetime模块进行简单的日期换算与计算
  10. 延时关机命令 linux,Ubuntu自动定时关机的方法
  11. 清华领军计划计算机试题,清华大学自主招生考试试题难吗
  12. OpenCV3学习笔记(1)- OpenCV安装配置、基本架构、使用CMake编译OpenCV源代码
  13. 动图如何在线制作?教你一键在线制作动图
  14. 人工智能内行盛会,错过再等一年!
  15. 信号完整性研究系列--什么是信号完整性
  16. Energy 收购 VDD Tech
  17. 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十九节:雾
  18. 春季高考计算机基础知识试题答案,2017山东春季高考语文答案|数学答案|英语答案|基础知识答案...
  19. 一个简单的数据查询到前端展示总结
  20. 【傻妞对接微信】傻妞对接微信机器人VLW,最新插件。

热门文章

  1. 一文看懂未来加密行业如何应对监管?
  2. 2017cad光标大小怎么调_cad光标设置,小编教你CAD的十字光标如何设置大小
  3. 【自然语言处理】详说中文自动分词
  4. app界面设计是什么?需要学习什么UI软件
  5. 如何将图片转换、合并为PDF文件?
  6. scrapy开始初始下载
  7. 小米手机计算机无法归零,小米体脂秤不归零怎么调
  8. 第四次机考(2019) C. f1二
  9. easyexcel复杂表格---包含单元格合并,表格标题,以及自定义字段写入
  10. glut glfw glad SOIL glm freetype等配置