QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#746852 | #5477. Cake Decoration | quannguyen2009 | WA | 4142ms | 3660kb | C++23 | 4.1kb | 2024-11-14 15:43:18 | 2024-11-14 15:43:19 |
Judging History
answer
// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;
const int N=1e5+5, mod = 998244353, inf = 1e18;
int X, L, R;
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> X >> L >> R; R--;
int res = 0;
int lo, hi, lc, rc, lp, rp, ld, rd, ans;
for (int a=1; a*(a+1)*(a+2)*(a+3)<=X; a++) {
for (int b=a+1; a*b*(b+1)*(b+2)<=X; b++) {
int n = X/(a*b);
// find lc, rc
lc = b+1;
lo = 0, hi = sqrtl(n)+10, ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if (mid*(mid+1)<=n) {
ans = mid;
lo = mid+1;
} else {
hi = mid-1;
}
}
rc = ans;
if(lc>rc) continue;
//L<=a+b<=R
if (lc<=rc && a+b>=L && a+b<=R) res = (res+(rc-lc+1)*4)%mod;
//L<=a+c<=R
lp = max(L-a, lc), rp = min(R-a, rc);
if(lp<=rp) res = (res+(rp-lp+1)*4)%mod;
//L<=b+c<=R
lp = max(L-b, lc); rp = min(R-b, rc);
if(lp<=rp) res = (res+(rp-lp+1)*4)%mod;
//L<=a+d<=R
ld = L-a, rd = R-a;
// --> ld <= n/c <= rd
lo = 1; hi = n+2; ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(n/mid>=ld) {
ans = mid;
lo = mid+1;
} else {
hi = mid-1;
}
}
rp = ans;
// cout << lp << " " << rp << " " << lc << " " << rc << '\n';
lo = 1; hi = n+2; ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(n/mid<=rd) {
hi = mid-1;
ans = mid;
} else {
lo = mid+1;
}
}
lp = ans;
lp = max(lp, lc); rp = min(rp, rc);
if(lp<=rp) res = (res+(rp-lp+1)*4)%mod;
//L<=b+d<=R
ld = L-b; rd = R-b;
//--> ld <= n/c <= rd
lo = 1; hi = n+2; ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(n/mid>=ld) {
ans = mid;
lo = mid+1;
} else {
hi = mid-1;
}
}
rp = ans;
lo = 1; hi = n+2; ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(n/mid<=rd) {
ans = mid;
hi = mid-1;
} else {
lo = mid+1;
}
}
lp = ans;
lp = max(lp, lc); rp = min(rp, rc);
if(lp<=rp) res = (res+(rp-lp+1)*4)%mod;
//L<=c+d<=R
lo=1; hi=rc+1; ans = -1;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(mid+n/mid>=L) {
ans = mid;
lo = mid+1;
} else {
hi = mid-1;
}
}
rp = ans;
if(rp+n/rp<L) rp--;
lo=1; hi=rc+1; ans = inf;
while(lo<=hi) {
int mid = (lo+hi)>>1;
if(mid+n/mid<=R) {
ans = mid;
hi = mid-1;
} else {
lo = mid+1;
}
}
lp = ans;
if(lp+n/lp>R) lp++;
lp = max(lp, lc); rp = min(rp, rc);
if(lp<=rp) res = (res+(rp-lp+1)*4)%mod;
}
}
cout << res;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3632kb
input:
24 4 6
output:
12
result:
ok single line: '12'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3596kb
input:
30 5 6
output:
4
result:
ok single line: '4'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3552kb
input:
30 9 20
output:
0
result:
ok single line: '0'
Test #4:
score: 0
Accepted
time: 4142ms
memory: 3496kb
input:
100000000000000 1 100000000000000
output:
288287412
result:
ok single line: '288287412'
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 3660kb
input:
51256 4 35
output:
29128
result:
wrong answer 1st lines differ - expected: '29116', found: '29128'