結果
| 問題 |
No.1634 Sorting Integers (Multiple of K) Hard
|
| コンテスト | |
| ユーザー |
re_re0101
|
| 提出日時 | 2021-07-30 22:54:31 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 416 ms / 3,000 ms |
| コード長 | 2,984 bytes |
| コンパイル時間 | 3,912 ms |
| コンパイル使用メモリ | 241,608 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-16 02:35:32 |
| 合計ジャッジ時間 | 12,341 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 28 |
コンパイルメッセージ
main.cpp:43:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
43 | main(){
| ^~~~
ソースコード
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
#define int long long
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define bit(n,k) (((ll)n>>(ll)k)&1) /*nのk bit目*/
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define eb emplace_back
#define endl '\n'
#define SZ(x) ((ll)(x).size())
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
typedef long long ll;
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
const long long MOD=1000000007;
ll modpow(ll a, ll n,ll mod=MOD) {
ll res = 1;
while (n > 0) {
if (n & 1) res = res * a % mod;
a = a * a % mod;
n >>= 1;
}
return res;
}
ll functional(int x){
if(x==0)return 1;
else return x*functional(x-1);
}
int cntv[10];
int vec[10];
main(){
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
cout << fixed << setprecision(12);
/*--------------------------------*/
int n,k;cin>>n>>k;
int ans=0;
int ma=0;
for(int i=1;i<=9;i++){
cin>>cntv[i];
if(cntv[i])chmax(ma,i);
}
if(n==1){
if(ma%k==0)cout<<1<<endl;
else cout<<0<<endl;
return 0;
}
unordered_map<int,int>exist;
unordered_map<int,int>exist2;
vector<int>vec(10);
auto dfs=[&](int cur,int cnt,auto &dfs)->void{
if(cnt>n/2)return;
if(cur==10){
if(cnt<n/2)return;
exist.clear();
exist2.clear();
vector<int>v;
string s;
for(int i=1;i<=9;i++){
for(int j=0;j<vec[i];j++)v.pb(i);
}
vector<int>v2;
string s2;
vector<int>cnt2(10);
for(int i=1;i<10;i++)cnt2[i]=cntv[i];
for(int i=0;i<n/2;i++){
cnt2[v[i]]--;
}
for(int i=1;i<=9;i++){
for(int j=0;j<cnt2[i];j++)v2.push_back(i);
}
for(int i=0;i<v.size();i++)s+=char(v[i]+'0');
for(int i=0;i<v2.size();i++)s2+=char(v2[i]+'0');
do{
exist[stoi(s)%k]++;
}while(next_permutation(all(s)));
int modp=modpow(10,n/2,k);
do{
int cur2=stoi(s2)%k;
cur2*=modp;
cur2%=k;
exist2[cur2]++;
}while(next_permutation(all(s2)));
if(exist.size()>exist2.size())swap(exist,exist2);
for(auto p:exist){
if(p.first==0)continue;
ans+=p.second*exist2[k-p.first];
}
ans+=exist[0]*exist2[0];
return;
}
for(int i=0;i<=cntv[cur];i++){
vec[cur]=i;
dfs(cur+1,cnt+i,dfs);
}
return;
};
dfs(1,0,dfs);
cout<<ans<<endl;
}
re_re0101