QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#275556 | #7257. Paint | PetroTarnavskyi# | WA | 1ms | 3712kb | C++20 | 3.2kb | 2023-12-04 20:33:09 | 2023-12-04 20:33:10 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, b, a) for(int i = (b) - 1; i >= (a); i--)
#define SZ(a) (int)a.size()
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
const int mod = 1e9 + 7;
void updAdd(int& a, int b)
{
a += b;
if(a >= mod)
a -= mod;
}
void updSub(int& a, int b)
{
a -= b;
if(a < 0)
a += mod;
}
int mult(int a, int b)
{
return (LL)a * b % mod;
}
int binpow(int a, int n)
{
int res = 1;
while(n)
{
if(n & 1)
res = mult(res, a);
a = mult(a, a);
n /= 2;
}
return res;
}
int inv(int x)
{
return binpow(x, mod - 2);
}
int C(int n, int m)
{
int ans = 1;
FOR(i, 0, m)
{
ans = mult(ans, n - i);
ans = mult(ans, inv(i + 1));
}
return ans;
}
int solve(int n, VI lens)
{
n -= SZ(lens) - 1;
FOR(i, 0, SZ(lens))
n -= lens[i];
if(n < 0)
return 0;
int cnt = 2 * SZ(lens) + 1;
return C(n + cnt - 1, cnt - 1);
}
set<vector<PII>> calculated;
int solve(int n, vector<PII> lens)
{
if(calculated.count(lens) == 1)
return 0;
calculated.insert(lens);
int ans = 0;
FOR(mask, 0, 1 << SZ(lens))
{
VI cur(SZ(lens));
FOR(i, 0, SZ(lens))
{
if((mask >> i) & 1)
cur[i] = lens[i].S;
else
cur[i] = lens[i].F;
}
int val = solve(n, cur);
if(__builtin_popcount(mask) % 2 == 0)
updAdd(ans, val);
else
updSub(ans, val);
}
return ans;
}
vector<PII> possible[4];
vector<PII> genVec;
int resRecalc = 0;
void rec(int pos, int sz, int n)
{
if(pos == sz)
{
updAdd(resRecalc, solve(n, genVec));
return;
}
for(auto val : possible[pos])
{
genVec.PB(val);
rec(pos + 1, sz, n);
genVec.pop_back();
}
}
VI vals;
int recalc(int n, vector<pair<int, LL>> lens)
{
resRecalc = 0;
FOR(i, 0, SZ(lens))
{
possible[i].clear();
int prev = lens[i].F;
FOR(j, 0, SZ(vals))
{
if(vals[j] <= prev)
continue;
possible[i].PB(MP(prev, vals[j]));
prev = vals[j];
if(vals[j] == lens[i].S)
break;
}
}
rec(0, SZ(lens), n);
return resRecalc;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(15);
int n, k;
cin >> n >> k;
VI a(k);
FOR(i, 0, k)
cin >> a[i];
FOR(mask, 1, 1 << k)
{
LL sum = 0;
FOR(i, 0, k)
if((mask >> i) & 1)
sum += a[i];
if(sum > n)
continue;
vals.PB(sum);
vals.PB(sum + 1);
}
sort(ALL(vals));
int ans = 0;
VI idx(k);
iota(ALL(idx), 0);
do{
FOR(mask, 0, 1 << (k - 1))
{
vector<pair<int, LL>> lens = {MP(a[idx[0]], a[idx[0]] + 1)};
FOR(i, 0, k - 1)
{
if((mask >> i) & 1)
{
lens.back().F = max(lens.back().F, a[idx[i + 1]]);
lens.back().S += a[idx[i + 1]];
}
else
lens.PB(MP(a[idx[i + 1]], a[idx[i + 1]] + 1));
}
FOR(i, 0, SZ(lens))
lens[i].S = min(lens[i].S, (LL)n + 1);
updAdd(ans, recalc(n, lens));
}
}while(next_permutation(ALL(idx)));
cout << ans << endl;
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3568kb
input:
10 2 1 1
output:
55
result:
ok 1 number(s): "55"
Test #2:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
1000000000 4 2015 2015 123456789 27
output:
782767239
result:
ok 1 number(s): "782767239"
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 3688kb
input:
1000000000 4 158260522 877914575 602436426 24979445
output:
788466232
result:
wrong answer 1st numbers differ - expected: '660970994', found: '788466232'