题解:P2350 [HAOI2012] 外星人
生活随笔
收集整理的這篇文章主要介紹了
题解:P2350 [HAOI2012] 外星人
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:P2350 [HAOI2012]外星人 。
題意
給出 N 的質因子分解。
令 N=φ(N)N=\varphi(N)N=φ(N) ,求最少進行多少次這樣的操作使得 N=1N=1N=1 。(因為 φ(1)=1\varphi(1)=1φ(1)=1 ,所以要限制「最少」)
φ(∏i=1npiqi)=∏i=1n(pi?1)piqi?1\varphi(\prod_{i=1}^{n}p_i^{q_i})=\prod_{i=1}^{n}(p_i-1)p_i^{q_i-1}φ(∏i=1n?piqi??)=∏i=1n?(pi??1)piqi??1? 。
思路
首先 N 很大,無法表示。所以只能去挖掘其性質。
然后發現在每次的 N=φ(N)N=\varphi(N)N=φ(N) 中,都會消耗一個 2 ,并產生若干個 2 。
又發現 N 的每個質因子產生的 2 是固定的。
所以預處理一下 1e5 內的質因子在迭代過程中所產生的 2 的個數即可 O(1)O(1)O(1) 給出答案。
若初始時 N 為奇數,即不含因子 2 ,則第一次迭代不消耗 2,但這不影響各個質因子產生的 2 的數量。所以若初始時 N 為奇數,操作數要加一。
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const int N = 1e5 + 23; int p[N], cnt, f[N]; bool st[N];void getp(int n = 1e5) {f[1] = 1;for (int i = 2; i <= n; i++){if(!st[i])p[++cnt] = i, f[i] = f[i - 1];for (int j = 1; p[j] * i <= n; j++){st[p[j] * i] = true;f[p[j] * i] = f[p[j]] + f[i];if(i % p[j] == 0)break;}} }int main() {getp();int T, m, p, q;cin >> T;while(T--){ll ans = 1ll;scanf("%d", &m);while(m--){scanf("%d%d", &p, &q);if(p == 2)ans--;ans += 1ll * f[p] * q;}printf("%lld\n", ans);}return 0; }總結
以上是生活随笔為你收集整理的题解:P2350 [HAOI2012] 外星人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java构造函数的调用
- 下一篇: pycharm中git的使用