QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#746852#5477. Cake Decorationquannguyen2009WA 4142ms3660kbC++234.1kb2024-11-14 15:43:182024-11-14 15:43:19

Judging History

你现在查看的是最新测评结果

  • [2024-11-14 15:43:19]
  • 评测
  • 测评结果:WA
  • 用时:4142ms
  • 内存:3660kb
  • [2024-11-14 15:43:18]
  • 提交

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'