1. 程式人生 > >Codeforces Round #520 (Div. 2) B Math(分解質因數思維)

Codeforces Round #520 (Div. 2) B Math(分解質因數思維)

題意:給你一個數字n,現在有兩種操作 1 : 把n乘上任意一個數,2:當n是一個完全平方數的時候,把這個數字開平方。現在問你最少經過幾次操作可以使得n最少。

思路:首先分解質因數,倘若一個數字的質因數出現的次數是2的冪的話,那麼我們就可以開平方,怎麼得來的?如果是2得冪次那麼每次就會少一半,一半,一半,那麼我們現在做的就是把n分解質因數,然後找到最大得冪次,之後把所有得所有得質因數變成最大得冪次,比如 2 2 2 3  ,那麼我們乘上 2 * 3 * 3 * 3 之後變成 2 * 2 * 2 * 3 * 3 * 3 * 3 之後開平方 變成 2 * 2 * 3 * 3  之後變成 2 * 3就好了,那麼顯然就是質因數的成績是最後的值

程式碼:

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
const int maxn = 1e6+10;
vector<int>E;
map<int,int>M;
int num = 0;
int vis[maxn] , fac[maxn];
void init(long long n)
{
    num=0;
    for(long long i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            while(n%i==0)M[i]++, n/=i;
        }
    }
    if(n>1) M[n]++;
    int cur = 1;
    for(int i = 0 ; cur <= maxn ; i ++) E.push_back(cur),cur = cur * 2;
}
int main()
{
	int n;
	scanf("%d",&n);
	init(n);
	int MAX = -1;
	for(auto i : M) MAX = max(MAX,i.Y);
	int pos = lower_bound(E.begin() , E.end() , MAX) - E.begin(); // 找到離MAX最大得2的冪次 ,那麼pos就是2的多少次冪 
	int ans = 1 , flag = 0;
	for(auto i : M)
	{
		ans = ans * i.X; //  
		if(i.Y < E[pos] && !flag) flag = 1, pos++; //
	}
	printf("%d %d\n",ans,pos);
}