码迷,mamicode.com
首页 > 其他好文 > 详细

[HAOI2012] 外星人 - 数论,欧拉函数

时间:2020-02-29 16:17:57      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:phi   const   操作   count   ++   fine   eof   函数   arp   

给定一个正整数的标准分解形式,求最小的 \(x\) 使得 \(\varphi^x(N)=1\),其中 \(\varphi(x)\) 表示 Euler 函数的 \(x\) 重嵌套。\(T\leq50, p_i\leq 10^5,q_i\leq10^9\)

Solution

观察到只有 \(\varphi(2)=1\),而对于 \(2^n\) 操作次数为 \(n\)

对任意一个大于 \(2\) 的质数,每次操作都至少会产生一个 \(2\) 因子,同时每次操作都会消除一个 \(2\) 因子

所以问题转化为求一个数在操作过程中一共会产生多少个 \(2\),如果是奇数的话需要额外 \(+1\)

\(f[i]\)\(i\) 在操作过程中一共会产生的 \(2\) 的个数

  • 如果 \(i\) 是质数,那么 \(f[i]=f[i-1]\)
  • 如果 \(i\) 是合数,那么 \(f[i]=f[p]+f[q]\),其中 \(pq=i\)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 200005;
int prime[MAXN+1],isp[MAXN+1]; // Note: Let prime[0] donate the number of primes
// Note: the array "prime" has two different roles in the algorithm
void presolve() {
    memset(prime,0,sizeof prime);
    for(int i=2;i<=MAXN;i++) {
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++) {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
    for(int i=1;i<=MAXN;i++) isp[prime[i]]=1;
}

int T,n,f[MAXN],p[MAXN],q[MAXN];

signed main() {
    presolve();
    f[1]=0; f[2]=1;
    for(int i=3;i<=MAXN;i++) {
        if(__builtin_popcount(i)==1) f[i]=log2(i);
        else if(isp[i]) f[i]=f[i-1];
        else {
            for(int j=2;j*j<=i;j++) {
                if(i%j==0) {
                    f[i]=f[j]+f[i/j];
                    break;
                }
            }
        }
    }
    //for(int i=1;i<=10;i++) cout<<f[i]<<" ";
    //cout<<endl;
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>p[i]>>q[i];
        int ans=1;
        for(int i=1;i<=n;i++) if(p[i]==2) ans=0;
        for(int i=1;i<=n;i++) ans+=f[p[i]]*q[i];
        cout<<ans<<endl;
    }
}

[HAOI2012] 外星人 - 数论,欧拉函数

标签:phi   const   操作   count   ++   fine   eof   函数   arp   

原文地址:https://www.cnblogs.com/mollnn/p/12383425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!