QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876559#9309. GraphHygebraWA 428ms210764kbC++143.3kb2025-01-31 00:00:552025-01-31 00:00:57

Judging History

This is the latest submission verdict.

  • [2025-01-31 00:00:57]
  • Judged
  • Verdict: WA
  • Time: 428ms
  • Memory: 210764kb
  • [2025-01-31 00:00:55]
  • Submitted

answer

//
// Created by Yang Hang on 2025/1/29.
//
#include <cstdio>
#include <cmath>
#include "vector"
using namespace std;
const int mod=998244353;
const int N=4000005;
int fact[N],ifact[N];
long long n;
inline int binom(int n,int m) {
    if (m>n || n<0 || m<0) return 0;
    return 1ll*fact[n]*ifact[m]%mod*ifact[n-m]%mod;
}
long long ksm(long long a,long long x) {
    long long s=1;
    while (x) {
        if (x&1) s=1ll*s*a%mod;
        a=1ll*a*a%mod;x>>=1;
    }
    return s;
}
const int INF = 2e9;
const long long INFLL = 4e18;
const int small_lim = 1e6+1;
const int big_lim = 1e5+1;
long long primes_till_i[small_lim];
long long primes_till_bigger_i[big_lim];
vector<long long> sieved_primes[small_lim];
vector<long long> sieved_primes_big[big_lim];
vector<long long> prime;
vector<int> lpf(small_lim);
void get(){
    long long pw;
    for(int i = 2; i < small_lim; i++){
        if(! lpf[i]){
            prime.push_back(i);
            lpf[i] = i;
        }
        for(int j : prime){
            if((j > lpf[i]) || (j*i >= small_lim)) break;
            lpf[j*i] = j;
        }
    }
    for(int i = 2; i < small_lim; i++){
        primes_till_i[i] = primes_till_i[i-1] + (lpf[i] == i);
    }
}
long long count_primes(long long x, int ind){
    if(ind < 0) return x - 1;
    if(1ll*prime[ind]*prime[ind] > x){
        if(x < small_lim) return primes_till_i[x];
        if(primes_till_bigger_i[n / x]) return primes_till_bigger_i[n / x];
        int l = -1, r = ind;
        while(r-l > 1){
            int mid = (l+r)>>1;
            if(1ll*prime[mid]*prime[mid] > x) r = mid;
            else l = mid;
        }
        return primes_till_bigger_i[n / x] = count_primes(x, l);
    }
    int sz;
    if(x < small_lim) sz = sieved_primes[x].size();
    else sz = sieved_primes_big[n / x].size();
    long long ans;
    if(sz <= ind){
        ans = count_primes(x, ind - 1);
        ans -= count_primes(x / prime[ind], ind - 1);
        ans += ind;
        if(x < small_lim) sieved_primes[x].push_back(ans);
        else sieved_primes_big[n / x].push_back(ans);
    }
    if(x < small_lim) return sieved_primes[x][ind];
    else return sieved_primes_big[n / x][ind];
}
long long count_primes(long long x){
    //printf("x = %lld\n",prime.size()-1);
    if(x < small_lim) return primes_till_i[x];
    if(primes_till_bigger_i[n/x]) return primes_till_bigger_i[n/x];
    //puts("c");
    return count_primes(x,prime.size()-1);
}
int main()
{
    get();
    //puts("c");
/*    for (int i=0;i<100;++i)
        if (count_primes(i) - count_primes(i-1))
            printf("%d ",i);puts("pr");*/
    fact[0]=1;
    for (int i=1;i<N;++i)
        fact[i]=1ll*fact[i-1]*i%mod;
    ifact[N-1]=ksm(fact[N-1],mod-2);
    for (int i=N-2;i>=0;--i)
        ifact[i]=(i+1ll)*ifact[i+1]%mod;
    scanf("%lld",&n);
    long long res = 1;
    for (long long l = 1, r, o,tmp; l<=n; l = r + 1) {
        o = n/l;
        r = n/o;
        tmp = count_primes(o)- count_primes(o/2);
        if (o<=2) {
            continue;
        } else if (o==3) res = res * ksm(3ll, r-l+1) % mod;
        else {
            //printf("[%lld - %lld] [n/d] = %lld, tmp = %lld\n", l, r, o, tmp);
            res = res * ksm((o - tmp - 1ll) * ksm(o % mod, tmp) % mod, r-l+1) % mod;
        }
    }
    printf("%lld\n",res);
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 43ms
memory: 73808kb

input:

4

output:

8

result:

ok answer is '8'

Test #2:

score: 0
Accepted
time: 46ms
memory: 73248kb

input:

2

output:

1

result:

ok answer is '1'

Test #3:

score: 0
Accepted
time: 41ms
memory: 73800kb

input:

123

output:

671840470

result:

ok answer is '671840470'

Test #4:

score: 0
Accepted
time: 42ms
memory: 73288kb

input:

233

output:

353738465

result:

ok answer is '353738465'

Test #5:

score: 0
Accepted
time: 47ms
memory: 73800kb

input:

5981

output:

970246821

result:

ok answer is '970246821'

Test #6:

score: 0
Accepted
time: 44ms
memory: 73376kb

input:

86422

output:

897815688

result:

ok answer is '897815688'

Test #7:

score: 0
Accepted
time: 42ms
memory: 73636kb

input:

145444

output:

189843901

result:

ok answer is '189843901'

Test #8:

score: 0
Accepted
time: 40ms
memory: 73764kb

input:

901000

output:

819449452

result:

ok answer is '819449452'

Test #9:

score: 0
Accepted
time: 42ms
memory: 73368kb

input:

1000000

output:

113573943

result:

ok answer is '113573943'

Test #10:

score: 0
Accepted
time: 40ms
memory: 74184kb

input:

23333333

output:

949849384

result:

ok answer is '949849384'

Test #11:

score: 0
Accepted
time: 48ms
memory: 75980kb

input:

102850434

output:

604886751

result:

ok answer is '604886751'

Test #12:

score: 0
Accepted
time: 78ms
memory: 86732kb

input:

998244353

output:

0

result:

ok answer is '0'

Test #13:

score: 0
Accepted
time: 79ms
memory: 86688kb

input:

1000000007

output:

318420284

result:

ok answer is '318420284'

Test #14:

score: 0
Accepted
time: 107ms
memory: 97356kb

input:

2147483547

output:

688759898

result:

ok answer is '688759898'

Test #15:

score: 0
Accepted
time: 162ms
memory: 120244kb

input:

5120103302

output:

116870489

result:

ok answer is '116870489'

Test #16:

score: -100
Wrong Answer
time: 428ms
memory: 210764kb

input:

19834593299

output:

-768482857

result:

wrong answer expected '523663743', found '-768482857'