RE求助
查看原帖
RE求助
428449
Amon_Xolotl楼主2023/9/1 15:44
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+3,M=5003,mod=998244353;
int n,a[M],b[M],ans;
int fac[N][4],prim[N],cnt;
int GCD[1003][1003];
inline int qpow(int x,int y)
{
  int ret=1;
  while(y)
  {
    if(y&1)
    {
      ret=(ll)ret*x%mod;
    }
    x=(ll)x*x%mod;
    y>>=1;
  }
  return ret;
}
bitset<N> vis;
inline int read()
{
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0')
  {
    if(ch=='-')
    {
      f=-f;
    }
    ch=getchar();
  }
  while(ch>='0'&&ch<='9')
  {
    x=x*10+ch-'0';
    ch=getchar();
  }
  return x*f;
}
int main()
{
  n=read();
  for(register int i=1;i<=n;++i)
  {
    a[i]=read();
  }
  for(register int i=1;i<=n;++i)
  {
    b[i]=read();
  }
  fac[1][1]=1;
  fac[1][2]=1;
  fac[1][3]=1;
  for(register int i=2;i<=N-2;++i)
  {
    if(!vis[i])
    {
      prim[++cnt]=i;
      fac[i][3]=i;
      fac[i][1]=1;
      fac[i][2]=1;
    }
    for(register int j=1;j<=cnt&&(ll)i*prim[j]<=N-2;++j)
    {
      if(!vis[i*prim[j]])
      {
        vis[i*prim[j]]=true;
        fac[i*prim[j]][1]=fac[i][1]*prim[j];
        fac[i*prim[j]][2]=fac[i][2];
        fac[i*prim[j]][3]=fac[i][3];
        if (fac[i*prim[j]][1]>fac[i*prim[j]][2])
        {
          fac[i*prim[j]][1]^=fac[i*prim[j]][2]^=fac[i*prim[j]][1]^=fac[i*prim[j]][2];
        }
        if (fac[i*prim[j]][2]>fac[i*prim[j]][3])
        {
        //  fac[i*prim[j]][2]^=fac[i*prim[j]][3]^=fac[i*prim[j]]][2]^=fac[i*prim[j]][3];
          fac[i*prim[j]][2]^=fac[i*prim[j]][3]^=fac[i*prim[j]][2]^=fac[i*prim[j]][3];
        }
      }
      if(i%prim[j]==0)
      {
        break;
      }
    }
  }
  for(register int i=0;i<=1000;++i)
  {
    GCD[0][i]=GCD[i][0]=i;
  }
  for(register int i=1;i*i<=N-2;++i)
  {
    for(register int j=1;j<=i;++j)
    {
      GCD[j][i]=GCD[i][j]=GCD[j][i%j];
    }
  }
  int k,wi;
  int s[4],sue,yao;
  for(register int i=1;i<=n;++i)
  {
    ans=0;
    wi=1;
   // cout<<fac[a[i]][1]<<" "<<fac[a[i]][2]<<" "<<fac[a[i]][3]<<endl;
    for(register int j=1;j<=n;++j)
    {
     wi=(ll)wi*i%mod;
    // cout<<fac[b[j]][1]<<" "<<fac[b[j]][2]<<" "<<fac[b[j]][3]<<endl;
      if(!vis[a[i]])
      {
        if(b[j]%a[i]==0)
        {
          ans=((ll)ans+(ll)wi*a[i]%mod+mod)%mod;
        }
        else
        {
          ans=((ll)ans+(ll)wi%mod+mod)%mod;
        }
        continue;
      }
      else if(!vis[b[j]])
      {
        if(a[i]%b[j]==0)
        {
          ans=((ll)ans+(ll)wi*b[j]%mod+mod)%mod;
        }
        else
        {
          ans=((ll)ans+(ll)wi%mod+mod)%mod;
        }
        continue;
      }
      sue=1;
      s[1]=fac[b[j]][1],s[2]=fac[b[j]][2],s[3]=fac[b[j]][3];
      for(register int x=1;x<=3;++x)
      {
        k=fac[a[i]][x];
        for(register int y=1;y<=3;++y)
        {
          sue=sue*GCD[k][s[y]]%mod;
          yao=GCD[k][s[y]];
          k/=yao;
          s[y]/=yao;
        }
      }
      
      ans=((ll)ans+(ll)wi*sue%mod+mod)%mod;
    //  cout<<sue<<endl;
    }
    printf("%d\n",ans);
  }
  return 0;
}
2023/9/1 15:44
加载中...