QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#743896#9619. 乘积,欧拉函数,求和_fcy_WA 6ms12036kbC++143.0kb2024-11-13 20:15:382024-11-13 20:15:48

Judging History

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

  • [2024-11-13 20:15:48]
  • 评测
  • 测评结果:WA
  • 用时:6ms
  • 内存:12036kb
  • [2024-11-13 20:15:38]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int maxn=1e5+10;
const int mod=998244353;
int n;
int f[maxn][2];
int jie[maxn],inv[maxn],factinv[maxn];
void init_ny(int x)
{
    factinv[0]=1; jie[0]=1;
	factinv[1]=1; inv[1]=1; jie[1]=1;
	for(int i=2;i<=x;i++)
	{
		inv[i]=(mod-mod/i)*inv[mod%i];
		inv[i]%=mod;
        jie[i]=jie[i-1]*i;
        jie[i]%=mod;
		factinv[i]=factinv[i-1]*inv[i];
		factinv[i]%=mod;
	}
}
pair<int,int> a[maxn];
vector <int> minp,primes;
vector <int> ver[maxn];
void sieve(int n){
    minp.assign(n+1,0);
    primes.clear();
    for(int i=2;i<=n;i++){
        if (minp[i]==0){
            minp[i]=i;
            primes.push_back(i);
        }
        for(auto p:primes){
            if(i*p>n){
                break;
            }
            minp[i*p]=p;
            if(p==minp[i]){
                break;
            }
        }
    }
}
int pr[maxn],rnk[maxn];
int add(int x,int y){
    x+=y; x%=mod; return x;
}
int mul(int x,int y){
    x*=y; x%=mod; return x;
}
signed main(){
    sieve(3005); init_ny(3005);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].se;
        int mx=1,x=a[i].se;
        while(x>1){
            mx=max(mx,minp[x]);
            x/=minp[x];
        }
        a[i].fi=mx;
    }
    sort(a+1,a+n+1);
    int piv=54;
    for(int i=1;i<=n;i++){
        int x=a[i].se;
        while(x>1){
            int tmp=minp[x];
            while(x%tmp==0){
                x/=tmp;
            }
            if(tmp<piv) ver[i].push_back(tmp);
        }
    }
    int cnt=0;
    for(auto u:primes){
        if(u>54) break;
        rnk[u]=cnt;
        pr[cnt]=u;
        cnt++;
    }
    f[0][0]=1;
    for(int i=1;i<=n;i++){
        if(a[i].fi!=a[i-1].fi){
            for(int j=0;j<(1<<cnt);j++){
                f[j][0]=add(f[j][0],f[j][1]);
                f[j][1]=0;
            }
        }
        for(int j=(1<<cnt)-1;j>=0;j--){
            for(int k=1;k>=0;k--){
                int nj=j,nk=k,val=f[j][k];
                val=mul(val,a[i].se);
                for(auto u:ver[i]){
                    if(u>piv){
                        if(~j>>rnk[u]&1){
                            nj|=(1<<rnk[u]);
                            val=mul(val,mul(u-1,inv[u]));
                        }
                    }
                    else{
                        if(nk==0){
                            val=mul(val,mul(u-1,inv[u]));
                        }
                        nk=1;
                    }
                }
                // if(k==0&&j==0){
                //     cout<<k<<" "<<j<<" "<<nj<<" "<<nk<<" "<<val<<endl;
                // }
                f[nj][nk]=add(f[nj][nk],val);
            }
        }
    }
    int ans=0;
    for(int i=0;i<(1<<cnt);i++){
        for(int j=0;j<=1;j++){
            ans=add(ans,f[i][j]);
            //if(i<=16) cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
        }
    }
    cout<<ans<<"\n";
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 6ms
memory: 12036kb

input:

5
1 6 8 6 2

output:

700

result:

wrong answer 1st lines differ - expected: '892', found: '700'