将n划分为最多m个以m为模的不同分区

时间:2018-07-25 21:06:05

标签: combinatorics number-theory

鉴于N和K,我们必须找到N划分为最多K个部分的数量
 模m。
我想知道是否有任何公式可以计算这种类型的查询。
我也知道有关递归公式pk(n)= pk(nk)+ pk-1(n)的信息
 图
但这可以在N和K较小时使用
我需要找到1≤N,K≤2 * 10 ^ 5
例如:-
p3(5)= 5,14,23,113,122 = 5
p3(3)= 3,12,111 = 3

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll pk(ll n,ll k,ll m)
{
    if(k==1)
        return 1;
    if(n<0)
        return 0;
    return (pk(n-k,k,m)%m+pk(n,k-1,m)%m)%m;
}
int main()
{
    ll t,m;
    cin>>t>>m;
    while(t--)
    {
        ll n,k;
        cin>>n>>k;
        cout<<pk(n,k,m)<<endl;
    }
    return 0;
}
Here is my implementation using the recurrence but it is giving TLE for  
large values as time complexity is 2^n 

我想创建一个dp表来查找类似的值

f(n,k):
if(n==k)
return 1;
if(n==0)
return 0;
if(dp[n][k]!=-1)
return dp[n][k];
b=f(n-k,k)+f(n-1,k-1);
return dp[n][k]=b;

DP表应类似于this

0 个答案:

没有答案