题目链接<https://www.nowcoder.com/acm/contest/107/G>
题解:
dp[i]表示有i个小国时的步数。
扫描所有的j(是i的因子)更新数组:dp[i]=dp[j]+(i/2-j)/(j-2)+1,化简为dp[i]=dp[j]+i/j-1。
#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
int dp[1000005];
int main(){
int t,n;
memset(dp,125,sizeof(dp));
dp[1]=0;
for(int i=1;i<=1000000;i++)
for(int j=2*i;j<=1000000;j+=i)
dp[j]=min(dp[j],dp[i]+j/i-1);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",dp[n]);
}
}
精简版本
#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int ans=0;
for(int i=2;i*i<=n;i++){
while(n%i==0){
ans+=i-1;
n/=i;
}
}
if(n>1)
ans+=n-1;
printf("%d\n",ans);
}
}