WA substack 4 第一个点悬赏关注求助,其余AC
查看原帖
WA substack 4 第一个点悬赏关注求助,其余AC
749714
xyzfrozen楼主2023/2/3 13:23
#include<bits/stdc++.h>
#define ll long long
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;

const int N=3e7+10,Q=2e6+10;
ll n,q[Q];
int t,m,cnt;
int pr[Q<<1],phi[N];
int v[N]; //最小质因子
bool p[N],pk[N]; //是某个质数的 k 次方

ll fr(){ //double 不能快读!!!!
    ll x=0,flag=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x*flag;
}
void fw(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) fw(x/10);
    putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}

void init(int x)
{
	v[1]=pk[1]=1;
    for(int i=2;i<=x;i++)
    {
        if(!p[i])
        {
            pr[++cnt]=i;
            v[i]=i;
            pk[i]=1;
        }
        for(int j=1;pr[j]<=x/i && j<=cnt;j++)
        {
        	if(v[i]<pr[j]) break;  //非最小质因子
            int t=pr[j]*i;
			v[t]=pr[j];p[t]=1;
			pk[t]=(pk[i] && (v[i]==pr[j]));
        }
        phi[i]=phi[i-1]+(v[i]==i);
    }
}

void solve()
{
	n=fr(),m=fr();
	for(int i=1;i<=m;i++) q[i]=fr();
	if(pr[m+1]<=n)
	{
		puts("game won't stop");
		return;
	}
	
	unordered_set<int> s;
	for(int i=1;i<=m;i++)
	{
		while(q[i]*q[i]>n && !pk[q[i]]) q[i]/=v[q[i]];
		//1 q[i]*q[i]<=n 求k
		//2 5 x 2^2 -> 5 除成 p^k
		if(q[i]*v[q[i]]>n) s.insert(v[q[i]]);
		
		//质数用完了
		if(s.size()==phi[n]) {fw(i),nl;return;}
		else if(m-i+s.size()<phi[n])
		{
			puts("game won't stop");
			return;
		}
	}
}

signed main()
{
	init(N-1);
	t=fr();
	while(t--) solve();

	return 0;
}

2023/2/3 13:23
加载中...