QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#372894#6399. Classic: Classical ProblemYu_XuaanWA 1ms3592kbC++142.9kb2024-03-31 20:27:392024-03-31 20:27:40

Judging History

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

  • [2024-03-31 20:27:40]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3592kb
  • [2024-03-31 20:27:39]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define ceil(x,y) ((x)+(y)-1)/(y) 
#define all(x) (x).begin(),(x).end()
typedef long long ll;

const int N=2e5+5;

int exgcd(int a,int b,int &x,int &y)
{
  if(b==0)
    return x=1,y=0,a;
  int res=exgcd(b,a%b,x,y),xx=x,yy=y;
  return x=yy,y=xx-a/b*yy,res;
}

int ksm(int a,int b,int mod)
{
  int res=1;
  while(b)
  {
    if(b&1)res=1ll*res*a%mod;
    a=1ll*a*a%mod,b>>=1;
  }
  return res;
}
inline int inv(int x,int mod){return ksm(x,mod-2,mod);}

void solve()
{
  int n,p;
  cin>>n>>p;
  vector<int> a(n);
  for(int i=0;i<n;i++)
    cin>>a[i];

  int ans=0;
  vector<int> res;

  for(int i=0;i<p;i++)
  {
    vector<int> vis(p+1);
    for(int j=0;j<n;j++)
      vis[(a[j]*i)%p]=1;
    for(int j=0;j<=p;j++)
      if(!vis[j])
      {
        if(j>=ans)
        {
          if(j==ans)res.push_back(i);
          else res={i};
          ans=j;
        }
        break;
      }
  }

  cout<<ans<<'\n';

  // cout<<res.size()<<' '<<ans<<'\n';
  // for(auto x:res)
  //   cout<<x<<" \n"[x==res.back()];
}

void solve2()
{
    int n,p,fl=0,ans=1;
    cin>>n>>p;
    vector<int> a(n),vis(p),res;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        vis[a[i]]=1;
    }

    if(!vis[0])
    {
      cout<<"1 1\n";
      cout<<"0\n";
      return;
    }

    if(n==1||n==p)
    {
      cout<<p<<' '<<n<<'\n';
      for(int i=0;i<p;i++)
        cout<<i<<" \n"[i==p-1];
      return;
    }

    if(p-n>=250)
    {
      // cerr<<"branch 1\n";
      for(int i=0;i<n;i++)
      {
        if(!a[i])continue;
        for(int cnt=0,j=a[i];;j+=a[i])
        {
          j%=p;
          ++cnt;
          if(!vis[j])
          {
            if(cnt>=ans)
            {
              int c=inv(a[i],p);
              if(cnt>ans)res={c};
              else res.push_back(c);
              ans=cnt;
            }
            break;
          }
        }
      }
    }
    else//250*2e5=4e7
    {
      // cerr<<"branch 2\n";
      vector<int> no;
      for(int i=0;i<p;i++)
        if(!vis[i])
          no.push_back(i);

      for(int i=0;i<n;i++)
      {
        if(!a[i])continue;
        int minx=1e9;
        for(auto x:no)
        {
          int k,tmp;
          exgcd(a[i],p,k,tmp);
          k=1ll*k*x%p;
          if(k<0)k+=1ll*ceil(-k,p)*p;
          k%=p;
          minx=min(k,minx);
        }
        if(minx>=ans)
        {
          int c=inv(a[i],p);
          if(minx>ans)res={c};
          else res.push_back(c);
          ans=minx;
        }
      }
    }

  cout<<res.size()<<' '<<ans<<'\n';
  sort(all(res));
  for(auto x:res)
    cout<<x<<" \n"[x==res.back()];
}

signed main()
{
    // freopen("1.in","r",stdin);
    // freopen("std.out","w",stdout);
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);std::cout.tie(0);
  int T=1;
  cin>>T;
  while(T--)
    solve2();
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3592kb

input:

3
2 3
0 2
3 5
2 3 4
3 5
0 2 3

output:

1 2
2
1 1
0
2 2
2 3

result:

ok 6 lines

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3572kb

input:

3
1 2
0
1 2
1
2 2
1 0

output:

2 1
0 1
1 1
0
2 2
0 1

result:

wrong answer 5th lines differ - expected: '1 2', found: '2 2'