P4163 [SCOI2007]排列
Problem
给一个数字串
多组数据。
Input
第一行一个整数
接下来
Output
每组数据一行一个整数表示答案。
Sample
Input 1
7
000 1
001 1
1234567890 1
123434 2
1234 7
12345 17
12345678 29
Output 1
1
3
3628800
90
3
6
1398
Solution
观察到
定义
但直接转移会计算重复,因为
又因为
代码:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int kmax = 1e3 + 3;
const int kmaxM = 13;
int a[kmax];
bool b[kmax];
char c[kmax];
int t, n, d;
long long f[1 << kmaxM][kmax];
void Solve() {
scanf("%s %d", c, &d);
n = strlen(c);
for (int i = 0; i < n; i++) {
a[i] = c[i] - '0';
}
memset(f, 0, sizeof(f));
f[0][0] = 1;
for (int i = 0; i < 1 << n; i++) {
memset(b, 0, sizeof(b)); // 清空标记
for (int j = 0; j < n; j++) {
if (i & (1 << j)) continue;
if (b[a[j]]) continue; // 标记过,不要重复计算
b[a[j]] = 1; // 添加标记
for (int k = 0; k < d; k++) {
f[i | (1 << j)][(k * 10 + a[j]) % d] += f[i][k]; // 转移
}
}
}
printf("%lld\n", f[(1 << n) - 1][0]);
}
int main() {
scanf("%d", &t);
while (t--) { // 多组数据
Solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】