Connecting...

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;
}
posted @ 2025-07-24 21:26  余亦宸  阅读(16)  评论(0)    收藏  举报