ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#199779 | #2989. 优美数 | Anonyme | 100 | 645ms | 7156kb | C++11 | 3.4kb | 2023-12-21 09:02:34 | 2023-12-21 12:01:34 |
answer
#include<bits/stdc++.h>
using namespace std;
#define QwQ330AwA return 0
#define ll __int128
void write(ll x) {
vector <int> stk;
while (x) stk.push_back(x % 10), x /= 10;
reverse(stk.begin(), stk.end());
for (auto w : stk) cout << w;
}
ll fac[33];
ll pw[33][33];
vector < pair <ll, ll> > pos[33];
ll c[33][33];
ll lim;
int id;
void dfs(int now, int cnt, ll ans, ll sum) {
// cout << now << ' ' << cnt << ' ';
// write(ans), cout << ' ';
// write(sum), cout << '\n';
if (sum < lim / pw[9][cnt]) return ;
if (now == 9) {
pos[id].push_back({sum * pw[9][cnt], ans});
return ;
}
for (int i = 0; i <= cnt; i++) {
dfs(now + 1, cnt - i, ans * c[cnt][i], sum * pw[now][i]);
}
}
void init() {
fac[0] = 1;
for (int i = 1; i <= 21; i++) fac[i] = fac[i - 1] * i;
for (int i = 1; i <= 10; i++) {
pw[i][0] = 1;
for (int j = 1; j < 33; j++) pw[i][j] = pw[i][j - 1] * i;
}
for (int i = 0; i <= 21; i++) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++) c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
}
}
int num[33];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
init();
ll Ans = 0;
for (int i = 1; i <= 21; i++) {
lim = fac[i];
for (int j = i + 1; j <= 21; j++) lim = min(lim, (fac[j] - 1) / pw[9][j - i] + 1);
id = i;
dfs(1, i, 1, 1);
sort(pos[i].begin(), pos[i].end());
//assert(pos[i].begin() -> first >= fac[i]);
// cout << i << endl;
// for (auto x : pos[i]) write(x.first), cout << ' ';
// cout << endl;
//cout << pos[i].size() << endl;
reverse(pos[i].begin(), pos[i].end());
vector < pair <ll, ll> > sp;
for (int j = 0, k = 0; j < (int)pos[i].size(); j = k) {
ll sum = 0;
while (k < (int)pos[i].size() && pos[i][j].first == pos[i][k].first) sum += pos[i][k].second, k++;
sp.push_back({pos[i][j].first, sum});
}
pos[i] = sp;
for (int j = 1; j < (int)pos[i].size(); j++) pos[i][j].second += pos[i][j - 1].second;
int l = 0, r = pos[i].size() - 1, ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (pos[i][mid].first >= fac[i]) ans = mid, l = mid + 1;
else r = mid - 1;
}
if (ans != -1) Ans += pos[i][ans].second;
}
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
if (s.length() > 21) {
write(Ans);
cout << '\n';
continue;
}
reverse(s.begin(), s.end());
for (int i = 0; i < (int)s.length(); i++) num[i] = s[i] - '0';
int len = s.length();
ll sum = 0;
for (int i = 1; i < len; i++) {
int l = 0, r = pos[i].size() - 1, ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (pos[i][mid].first >= fac[i]) ans = mid, l = mid + 1;
else r = mid - 1;
}
if (ans != -1) sum += pos[i][ans].second;
}
ll pre = 1;
for (int i = len - 1; i >= 0; i--) {
for (int x = 1; x < num[i]; x++) {
if (i == 0) {
sum += (pre * x >= fac[len]);
continue;
}
int l = 0, r = pos[i].size() - 1, ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
ll p = pos[i][mid].first;
p *= x;
if (p >= fac[len]) {
ans = mid;
l = mid + 1;
} else {
p *= pre;
if (p >= fac[len]) ans = mid, l = mid + 1;
else r = mid - 1;
}
}
if (ans != -1) sum += pos[i][ans].second;
}
pre *= num[i];
if (pre == 0) break;
}
if (pre >= fac[len]) sum++;
write(sum);
cout << '\n';
}
QwQ330AwA;
}
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 38ms
memory: 7152kb
input:
10000 47837 518455 655112 954345 600612 439802 420101 521472 537870 564701 532021 80484 18346 373734...
output:
28521 255105 331170 498198 305480 214091 203166 256272 266189 282501 262266 49149 10929 181859 39705...
result:
ok 10000 numbers
Test #2:
score: 10
Accepted
time: 46ms
memory: 7156kb
input:
10000 4058707 38032 2504347 7593417 4041877 8727030 1346770 7742834 7692976 554753 2279696 5140166 2...
output:
1576280 22467 940084 3142681 1576280 3683468 565983 3220642 3197318 276248 852824 2010866 931280 344...
result:
ok 10000 numbers
Test #3:
score: 10
Accepted
time: 105ms
memory: 7152kb
input:
10000 980475503196470826 409488057248738093 964119271402833647 578964283299264159 142509873610207494...
output:
2071241664423 1970523647942 2056479141675 1974294607826 1969798331582 1603540352679 1971880091330 19...
result:
ok 10000 numbers
Test #4:
score: 10
Accepted
time: 109ms
memory: 7156kb
input:
10000 810356108140771788 300489122283682456 762404595750439923 480865512993981847 550163957708337313...
output:
2015446574701 1969871629532 1993921074841 1971184218783 1973110540433 2052181582591 1987832109612 19...
result:
ok 10000 numbers
Test #5:
score: 10
Accepted
time: 41ms
memory: 7156kb
input:
3 8212662212468102540154365 19445655726298305109 97190067946627003
output:
2121793450243 2121511412240 1861031606514
result:
ok 3 number(s): "2121793450243 2121511412240 1861031606514"
Test #6:
score: 10
Accepted
time: 38ms
memory: 7156kb
input:
3 6483332648160372 3892040543298291125323 40247259935
output:
1031619953982 2121793450243 2613238047
result:
ok 3 number(s): "1031619953982 2121793450243 2613238047"
Test #7:
score: 10
Accepted
time: 38ms
memory: 7152kb
input:
200 282198 9455423614089 560151079866656 8058866664071192 18431809 622570433460150897110199 53873023...
output:
136630 122292625535 484191134993 1216741215387 5645680 2121793450243 58672426490 336568368 212179345...
result:
ok 200 numbers
Test #8:
score: 10
Accepted
time: 42ms
memory: 7156kb
input:
200 248212546060755377765 2951478667201 5087 9147186474579 918 7 65639 931533331045710461 8192108437...
output:
2121793167295 41565106450 3505 119237514903 729 7 39570 2052221635237 682457002854 6279 212169718855...
result:
ok 200 numbers
Test #9:
score: 10
Accepted
time: 102ms
memory: 7152kb
input:
10000 6112878206338759544 30104707437906067469 99979487336233526005 55863650164083552054 87604483409...
output:
2107155938386 2121511412241 2121744195978 2121511594073 2121552264516 2121511420735 2121511412240 21...
result:
ok 10000 numbers
Test #10:
score: 10
Accepted
time: 86ms
memory: 7152kb
input:
10000 64229512433483029478 3662181692760349362 12485423318924806225 34778296778156581266 31579270837...
output:
2121513598993 2106700807499 2121511412240 2121511412241 2106700763074 2121627144876 2106712293588 21...
result:
ok 10000 numbers
Extra Test:
score: 0
Extra Test Passed