0070:Combination of Number Sequences

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0070
























dp[使った数字][和]:=場合の数

#include<iostream>
#include<vector>
#include<algorithm>
#include<cassert>

#define all(c) (c).begin(),(c).end()

using namespace std;

int count(int bits){
  bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
  bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
  bits =(((bits >> 4) + bits) & 0x0f0f0f0f);
  bits += bits >> 8;
  return (bits + (bits >> 16)) & 0xff;
}

int dp[(1<<10)][1002];

int main(void){

  dp[0][0]=1;
  for(int S=0;S<(1<<10);S++){
    for(int i=0;i<10;i++){
      if(!(S>>i&1)){
        for(int s=0;s<1000;s++){
          if((count(S)+1)*i+s<1000)
          dp[S|(1<<i)][(count(S)+1)*i+s]+=dp[S][s];
        }
      }
    }
  }

  int n,s;

  while(cin >> n >> s){

    if(s>=1000){
      cout << 0 << endl;
      continue;
    }

    int ans=0;
    for(int i=0;i<(1<<10);i++)
      if(count(i)==n)ans+=dp[i][s];

    cout << ans << endl;
  }


  return 0;
}