AT_abc132_f [ABC132F] Small Products
AT_abc132_f [ABC132F] Small Products
dp[i][j]到 i个数,最后一个位置放j,答案是dp
\[dp_{i,j}=\sum_{k=1}^{\lfloor\frac{n}{j}\rfloor} dp_{i-1,k}\\
\]
数论分块辅助转移。dp[i][cnt]到 i个数,cnt这个块(代表n/j=const_cnt的所有j)内的ans,答案都是dp
\[dp_{i,cnt}=\sum_{k=1}^{cnt'}l_{k}\times dp_{i-1,k}\\
cnt'=b_{n/l_{cnt}} \\
b为端点对应的cnt
\]
因为要 \(dp\) 和,顺便维护前缀和。
我卡在了 \(b_{n/l_{cnt}}\) 。
被迫研读题解。
Code:
#include<bits/stdc++.h>
using namespace std;
#define int __int128
#define ll long long
const int N=1e5+10,K=111,mod=1e9+7;
ll n,k,cnt;
int dp[K][N];
map<int,int> b;
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>k;
cnt=0;
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
r=min((ll)r,(ll)n);
++cnt;
b[r]=cnt;
}
for(int i=1;i<=cnt;++i)dp[0][i]=1;
for(int i=1;i<=k;++i){
cnt=0;
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
r=min((ll)r,(ll)n);
++cnt;
dp[i][cnt]=dp[i][cnt-1]+dp[i-1][b[n/r]]*(r-l+1)%mod;
dp[i][cnt]%=mod;
}
}
cout<<(ll)(dp[k][cnt]%mod)<<"\n";
return 0;
}

浙公网安备 33010602011771号