結果
| 問題 |
No.1634 Sorting Integers (Multiple of K) Hard
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-07-31 03:07:32 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 291 ms / 3,000 ms |
| コード長 | 1,914 bytes |
| コンパイル時間 | 2,166 ms |
| コンパイル使用メモリ | 196,496 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-16 06:01:38 |
| 合計ジャッジ時間 | 8,452 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 28 |
ソースコード
//#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
//using namespace atcoder;
using ll = long long;
#define all(A) A.begin(),A.end()
using vll = vector<ll>;
#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
using Graph = vector<vector<ll>>;
vector<vector<int>> BOX;
//max C size 通りの全列挙
int k = 0;
vector<int> now_vector;
void next_combination(int size, int max, int k) {
if (k == size) {
BOX.push_back(now_vector);
}
else {
if (k == 0) {
for (int i = 0; i < max; i++) {
now_vector[k] = i;
k++;
next_combination(size, max, k);
k--;
}
}
else {
int LAST = now_vector[k - 1];
for (int i = LAST + 1; i < max; i++) {
now_vector[k] = i;
k++;
next_combination(size, max, k);
k--;
}
}
}
return;
}
int main() {
int N, K;
cin >> N >> K;
vector<int> C(9);
vector<int> D;
for(int i=0;i<9;i++) {
cin >> C[i];
for(int j=C[i]-1;j>=0;j--)D.push_back(i + 1);
}
int n = N / 2;
now_vector.assign(n, -1);
next_combination(n, N, 0);
ll an = 0;
unordered_set<string> Poo;
vector<vector<int>> KK(14,vector<int> (10));
ll as=1;
for(int i=0;i<N;i++) {
for(int j=0;j<9;j++){
KK[i][j]=(as*(j+1))%K;
}
as*=10;
as%=K;
}
for(int i=BOX.size()-1;i>=0;i--) {
string AU;
unordered_set<int> S;
for(int k=0;k<n;k++) {
S.insert(BOX[i][k]);
AU.push_back(D[BOX[i][k]]);
}
if (Poo.count(AU))continue;
Poo.insert(AU);
string BU;
for(int k=0;k<N;k++){
if (!S.count(k))BU.push_back(D[k]);
}
ll x = 0;
unordered_map<int, int> M1;
do {
x = 0;
for(int u=0;u<n;u++){
x += KK[u][AU[u]-1];
}
x %= K;
M1[x]++;
} while (next_permutation(all(AU)));
do {
x = 0;
for(int u=0;u<N-n;u++) {
x+=KK[u+n][BU[u]-1];
}
x %= K;
if (x == 0)x += K;
if(M1.count(K-x))an += M1[K - x];
} while (next_permutation(all(BU)));
}
cout << an << endl;
}