思路
想要讓操作次數最多, z z z 就要盡可能小。
由于 z z z 是 N N N 的因數,所以 p p p 就是 N N N 的質因數。
設 N N N 的質因數中有 x x x 個 p p p,則這個 p p p 能執行 y y y 此操作,并且 y y y 滿足 ∑ i = 1 y i ≤ x \displaystyle\sum_{i=1}^y i\le x i=1∑y?i≤x。
所以我們只需要累加 N N N 的每個質因數的個數,再依次減 1 1 1、減 2 2 2、減 3 3 3、……能減幾次就將答案累加幾。
Code
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int n,ans,cnt[100000],len;
int Cnt(int num) {int sum=0;while(num-sum>0) num-=sum+1,++sum;//判斷能減幾次return sum;
}
signed main() {ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=2;i*i<=n;++i)//累加質因數個數if(n%i==0) {while(n%i==0) ++cnt[len],n/=i;++len;}if(n!=1) cnt[len++]=1;//如果N不為1那么N本身也可以for(int i=0;i<len;++i) ans+=Cnt(cnt[i]);//累加答案cout<<ans;return 0;
}