「AOJ再挑戦96~100」の編集履歴(バックアップ)一覧に戻る
#include<stdio.h> #include<iostream> #include<string.h> long long int memo[4001]={0}; void calc(int up){ long long int sum=0; long long int next[4001]={0}; for(int i=0;i<=up;i++){ sum+=memo[i]; if(i>1000){ sum-=memo[i-1001]; } next[i]=sum; } memcpy(memo,next,sizeof(next)); } int main(){ for(int i=0;i<=1000;i++)memo[i]=1;//aを決定 calc(2000); calc(3000); calc(4000); int n; while(scanf("%d",&n)!=EOF){ std::cout<<memo[n]<<"\n"; } }
#include<stdio.h> #include<string.h> #include<iostream> int main(){ long long int dp[10][1001]; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=0;i<=100;i++){ for(int k=9;k>=1;k--){ for(int j=0;j+i<=1000;j++){ dp[k][j+i]+=dp[k-1][j]; } } } int n,s; while(1){ scanf("%d %d",&n,&s); if(n==0&&s==0)break; std::cout<<dp[n][s]<<"\n"; } }