首先考察c(l,r):
由此可见c(l,r)可以分解为一串欧拉函数值的和,且可以借由前缀和、数论分块的手段 地解决。
再考虑目标,能够预想,最优时,按某种规则均匀分布
并且显然有一个的DP,我们可以尝试优化它。
回头考虑c(l,r),其中函数P的系数在时恒为1,也即此时c(l,r)的值与函数分布无关,于是我们发现的一个分划满足,于是我们只需考虑的情况。
那么我们可以的进行DP,然而这样的复杂度仍然偏高,我们可以尝试优化DP,考虑到目标决策状态具有某种意义上的分布均匀性,我们可以试图证明其决策单调性,四边形不等式是一个不错的选择。
所以我们可以用分治DP来优化至。
下附AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 100010
ll phi[MAXN],P[MAXN];
void totient(){
P[0]=0,P[1]=1;
for(int i=0;i<MAXN;++i){
phi[i]=1;
}
for(ll i=2;i<MAXN;++i){
if(phi[i]==1){
for(ll j=i;j<MAXN;j*=i){
for(ll k=j;k<MAXN;k+=j){
if(j==i){
phi[k]*=i-1;
}
else{
phi[k]*=i;
}
}
}
}
P[i]=P[i-1]+phi[i];
}
}
const ll inf=1E18;
ll c(int l,int r){
if(l>r)return inf;
ll sum=0;
while(l<=r){
int pr=r/(r/l);
if(pr>r)pr=r;
sum+=(pr-l+1)*P[r/l];
l=pr+1;
}
return sum;
}
ll dp[MAXN][18];
int MIN(int x,int y){
if(x<y){
return x;
}
return y;
}
void DC_DP(int d,int l,int r,int optl,int optr){
if(l>r){
return;
}
ll m=(l+r)>>1;
ll opt=MIN(optr,m);
ll cost=c(opt+1,m);
dp[m][d]=inf;
for(int k=opt;k>=optl;--k){
ll prc=cost+dp[k][d-1];
if(dp[m][d]>prc){
dp[m][d]=prc;
opt=k;
}
if(cost==inf){
cost=c(k,m);//for next
}
else{
cost+=P[m/k];
}
}
DC_DP(d,l,m-1,optl,opt);
DC_DP(d,m+1,r,opt,optr);
}
int main(){
int T,n,k;
scanf("%d",&T);
totient();
n=100000;
k=17;
for(int i=0;i<=n;++i){
dp[i][1]=c(1,i);
}
for(int i=2;i<=k;++i){
DC_DP(i,1,n,1,n);
}
while(T--){
scanf("%d%d",&n,&k);
if((k>=18)||((1<<k)>n)){
printf("%d\n",n);
continue;
}
printf("%lld\n",dp[n][k]);
}
}