結果
| 問題 |
No.1463 Hungry Kanten
|
| コンテスト | |
| ユーザー |
Example0911
|
| 提出日時 | 2021-04-03 18:59:43 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 865 ms / 2,000 ms |
| コード長 | 2,415 bytes |
| コンパイル時間 | 2,317 ms |
| コンパイル使用メモリ | 214,000 KB |
| 実行使用メモリ | 35,200 KB |
| 最終ジャッジ日時 | 2025-06-20 01:35:24 |
| 合計ジャッジ時間 | 6,157 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 24 |
ソースコード
#include "bits/stdc++.h"
//#define int long long
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
const ll INF = (1LL << 61);
ll mod = 1000000007;
vector<int> carry_and_fix(vector<int> digit) {
int N = digit.size();
for (int i = 0; i < N - 1; ++i) {
// 繰り上がり処理 (K は繰り上がりの回数)
if (digit[i] >= 10) {
int K = digit[i] / 10;
digit[i] -= K * 10;
digit[i + 1] += K;
}
// 繰り下がり処理 (K は繰り下がりの回数)
if (digit[i] < 0) {
int K = (-digit[i] - 1) / 10 + 1;
digit[i] += K * 10;
digit[i + 1] -= K;
}
}
// 一番上の桁が 10 以上なら、桁数を増やすことを繰り返す
while (digit.back() >= 10) {
int K = digit.back() / 10;
digit.back() -= K * 10;
digit.push_back(K);
}
// 1 桁の「0」以外なら、一番上の桁の 0 (リーディング・ゼロ) を消す
while (digit.size() >= 2 && digit.back() == 0) {
digit.pop_back();
}
return digit;
}
vector<int> multiplication(vector<int> digit_a, vector<int> digit_b) {
int NA = digit_a.size(); // A の桁数
int NB = digit_b.size(); // B の桁数
vector<int> res(NA + NB - 1);
for (int i = 0; i < NA; ++i) {
for (int j = 0; j < NB; ++j) {
res[i + j] += digit_a[i] * digit_b[j];
// 答えの i+j の位に digit_a[i] * digit_b[j] を足す
}
}
return carry_and_fix(res);
}
string bigint_to_string(vector<int> digit) {
int N = digit.size(); // N = (配列 digit の長さ)
string str = "";
for (int i = N - 1; i >= 0; --i) {
str += digit[i] + '0';
}
return str;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll N, K; cin >> N >> K;
vector<ll>A(N); for (int i = 0; i < N; i++)cin >> A[i];
vector<vector<int>>now(N);
for (int i = 0; i < N; i++) {
string S = to_string(A[i]);
ll n = S.size();
for (int j = 0; j < n; j++) {
now[i].push_back(S[n - j - 1] - '0');
}
}
map<string, bool>mp;
for (ll bit = 0; bit < (1LL << N); bit++) {
int cnt = 0;
for (ll i = 0; i < N; i++) {
if (bit >> i & 1) {
cnt++;
}
}
if (cnt < K)continue;
ll sum = 0;
for (ll i = 0; i < N; i++) {
if (bit >> i & 1)sum += A[i];
}
string s = to_string(sum);
mp[s] = true;
vector<int>tmp = { 1 };
for (ll i = 0; i < N; i++) {
if (bit >> i & 1) {
tmp = multiplication(tmp, now[i]);
}
}
s = bigint_to_string(tmp);
mp[s] = true;
}
cout << mp.size() << endl;
return 0;
}
Example0911