dp[statu][mod] 表示还剩的位为statu且之前余数为mod时的个数
简单的数位DP
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long dp[( 1 << 16 ) + 10][22];
int number[20], cnt;
int base, K;
long long DFS( int statu, int mod, int num ){
if( num == cnt ){
return mod == 0;
}
if( dp[statu][mod] != -1 ){
return dp[statu][mod];
}
long long ans = 0;
for( int i = 0; i < cnt; i++ ){
if( statu & ( 1 << i ) ){
ans += DFS( statu ^ ( 1 << i ), ( mod * base + number[i] ) % K, num + 1 );
}
}
return dp[statu][mod] = ans;
}
int main(){
int T, Case = 1;
scanf( "%d", &T );
while( T-- ){
scanf( "%d%d", &base, &K );
char s[20];
scanf( "%s", s );
cnt = 0;
for( int i = 0; s[i]; i++ ){
if( s[i] >= '0' && s[i] <= '9' ){
number[cnt++] = s[i] - '0';
}else if( s[i] >= 'A' && s[i] <= 'F' ){
number[cnt++] = s[i] - 'A' + 10;
}
}
memset( dp, -1, sizeof( dp ) );
cout << "Case " << Case++ << ": " << DFS( ( 1 << cnt ) - 1, 0, 0 ) << endl;
}
return 0;
}