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

给定一个正整数的标准分解形式,求最小的 \(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;
    }
}

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

时间: 2024-10-14 03:04:38

[HAOI2012] 外星人 - 数论,欧拉函数的相关文章

HDU 4002 Find the maximum(数论-欧拉函数)

Find the maximum Problem Description Euler's Totient function, φ (n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n . For example, as 1, 2, 4, 5, 7, and 8, are all less than

欧拉函数性质与求法 [数论][欧拉函数]

n的欧拉函数值用符号φ(n)表示 欧拉函数的定义是,对于一个正整数n,小于n且与n互质的数的数目(包括1,特殊地,φ(1)=1 ). 设p1,p2,p3,...,pr为n的全部r个质因数,则有φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pr). 显然,用这个方法来计算单个欧拉函数是可以求解的. 附上代码: 1 int get_phi(int x){ 2 int re=x; 3 for(int i=2;i*i<=x;i++) 4 if(x%i

POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,数论-整数快速幂)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7693   Accepted: 2522 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

hdu1395 数论 欧拉函数

hdu1395 数论   欧拉函数对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解2.如果是奇数 首先根据欧拉定理 我们可知 phi(n)一定是满足要求的 然后答案一定是 phi( i ) 的因数 然后我们就可以 O(sqrt(phi(i))的时间内 枚举每个因数 然后快速幂验证就行了 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const double eps

数论-欧拉函数

题目1 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数的个

数论&#183;欧拉函数

欧拉函数$phi(n)$表示不超过$n$的正整数中与$n$互质的个数,并且有: $\varphi(n)= n\sum\limits_{p|n}(1-{\frac 1{p}})$ 显然有若$n$素数: $\varphi(n)=n-1$ 并且考虑$mp$,若$p$为素数,则对任意整数$k$: $(mp, k)\Leftrightarrow (m, k)$ 于是在每个模$p$的剩余系中有$\varphi(m)$个数与$mp$互质,因此: $\varphi(mp)=\varphi(m)\varphi(p

HDU1695-GCD(数论-欧拉函数-容斥)

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5454    Accepted Submission(s): 1957 Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y

数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points

Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5636   Accepted: 3317 Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible fr

数论 - 欧拉函数模板题 --- poj 2407 : Relatives

Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 5544 Description Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if ther