Codeforces Round #520 (Div. 2) B Math(分解質因數思維)
阿新 • • 發佈:2018-12-21
題意:給你一個數字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); }