題意:
思路:我們把m提取因子,轉化成a√b的形式(最簡形式),這樣就轉化成了把a劃分為不大於n個正整數的方案總數。我們用dp[n][m]表示將n劃分為m個正整數的方案數,假設m份中不存在有1的情況,我們先拿出m個1,均分到m份中,再看dp[n-m][m]就行。如果有存在1的情況,我們可以由dp[n-1][m-1]轉化而來,就是拿乙個1成為單獨的乙份加在n-1分成m-1份中。
**
#include
#define endl '\n'
#define null null
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define vi vector
#define mii map
#define pii pair
#define ull unsigned long long
#define all(x) x.begin(),x.end()
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<
char
*fs,
*ft,buf[
1<<20]
;#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}using
namespace std;
const
int n=
1e6+5;
const
int inf=
0x7fffffff
;const
int mod=
998244353
;const
double eps=
1e-6
;int dp[
1005][
1005];
signed
main()
if(cnt>1)
a*=pow
(i,cnt/2)
;}} dp[0]
[0]=
1;for(
int i=
1;i<=a;i++)}
ll res=0;
for(
int i=
1;i<=n;i++
) res=
(res+dp[a]
[i])
%mod;
cout<
}
A 小V和方程(劃分 數dp)
a 分析 n個根號數的和等於m,求本質不同的方案數,對於m一頂滿足m a x,那麼實際上就是a個球放入n個箱子中的整數劃分問題,箱子可為空 includeusing namespace std typedef long long ll define pb push back const int in...
整數劃分問題
整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...
整數劃分問題
給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...