您的位置:首页 > 其它

吴神,人类的希望(1721)

2013-06-07 13:26 232 查看
题意:给出一个数,把其分成不同的数的组合的和是这样的数,且满足两一个分出来的数要大于等于K

   求这样的组合有多少个

思路:就是用DFS依次搜索分出的数的组合个数(一定要是增序的,不然会有更多结果)

   但只是DFS会超时的,这样就可以用dp[i][j]来记录其计算过的值。其意思是i的数

当然选的是j大的数(所以后面的搜索就不能小于这个数了)

但是用时还是挺多的,都差点没有过了,,感觉这样做很暴力。

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

#define N 1001
#define M 1000000007

int dp

;
bool vis

;
int t;
int n,k;

int dfs(int i,int j)
{

if (vis[i][j])
return dp[i][j];

dp[i][j]=0;
for (int cur=j;cur<=i;cur++)
{
dp[i][j]+=dfs(i-cur,cur);
dp[i][j]%=M;
}

vis[i][j]=true;
return dp[i][j];
}

int main()
{

freopen("in.txt","r",stdin);
int i,j;

memset(vis,false,sizeof(vis));
vis[0][0]=true;
dp[0][0]=1;
for (i=1;i<N;i++)
{
dp[0][i]=1;
vis[0][i]=true;
}

cin>>t;
while (t--)
{
scanf("%d%d",&n,&k);
printf("%d\n",dfs(n,k));
}

return 0;
}


在网上看到的一个高效算法:

只要6MS

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#define maxn 200005
#define eps 1e-8
#define inf 1<<30
#define LL long long
#define zero(a) fabs(a)<eps
#define MOD 1000000007
using namespace std;
int c[1005][1005]={0};
void Init(){
for(int i=0;i<=1000;i++){
c[i][0]=0;c[i][1]=1;c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-j][j])%MOD;
}
}
int main(){
int t,n,k;
Init();
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
int ans=0;
for(int m=1;m<=n/k;m++)
ans=(ans+c[n-m*k+m][m])%MOD;
printf("%d\n",ans);
}
return 0;
}


吴神,人类的希望

Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 60 Tried: 167


Submit


Status


Best Solution


Back

Description

公元18906416年,由于歌者无节制的使用二向箔,整个宇宙都将不可避免的跌入二次元。为了拯救学弟们,吴神决定使用一种叫smxrwzdx的基本粒子创造一个新的宇宙,吴神发现,用不同数量的smxrwzdx可以组合成不同的粒子,比如用两个smxrwzdx就可以组成一个魔理沙,三个smxrwzdx就可以组成一个洛天依,总之,无论怎样组合,都会产生一个好的结果(不要吐槽,吴神就是有这么神),现在吴神有n个smxrwzdx粒子,为了保持新宇宙的稳定性,吴神要求所组成每一种物质都必须至少包含k个smxrwzdx粒子,现在吴神想知道的是,如果他有n个smxrwzdx,有多少种不同的世界能够被创造出来。比如吴神有6个smxrwzdx,k为2。那么吴神可以有4种方案:(2,2,2)(4,2)(3,3)(6)。

Input

第一行有个整数T,代表数据组数(T<=10^6)

接下来有T行,每行有两个整数n k (1<=n,k<=1000)

Output

每组数据输出一行,表示吴神有多少种不同的世界能够被创造出来,由于答案可能很大,所以答案要模10^9+7。

Sample Input

3

2 1

4 2

6 2

Sample Output

2

2

4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: