zoukankan      html  css  js  c++  java
  • [HAOI2012] 外星人

    给定一个正整数的标准分解形式,求最小的 (x) 使得 (varphi^x(N)=1),其中 (varphi(x)) 表示 Euler 函数的 (x) 重嵌套。(Tleq50, p_ileq 10^5,q_ileq10^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;
        }
    }
    
    
  • 相关阅读:
    我们的故事
    实验三 进程调度模拟程序
    Java环境配置XXX系统(标题党)
    .Net多线程和线程通信(标题党)
    关于数据库死锁,数据库脏数据和产生的原因,数据库事务(标题党)
    微服务架构(一):什么是微服务
    .NET Core 实践一:微服务架构的优点(转)
    .NET Core 实践二:事件通知和异步处理
    设计模式之单例模式
    数组式访问-ArrayAccess
  • 原文地址:https://www.cnblogs.com/mollnn/p/12383425.html
Copyright © 2011-2022 走看看