P8036 题解

· · 题解

Part 1

Part 2

Part 3

Part 4

#include<bits/stdc++.h>
using namespace std;

const int N=3e6,M=5e5+10,G=155;
int Q,k,l,m;
int v[N],prime[M],id,ans[G][G];
bool st[G];

inline int read()
{
    int x=0;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch))  x=x*10+ch-'0',ch=getchar();
    return x;
}
inline void write(int x)
{
    if(!x)  return;
    write(x/10);
    putchar(x%10+'0');
}
inline void init()
{
    for(register int i=2;i<=N-10;i++)
    {
        if(!v[i])   v[i]=i,prime[++id]=i;
        for(int j=1;j<=id;j++)
        {
            if(i*prime[j]>N-10||prime[j]>v[i])  break;
            v[i*prime[j]]=prime[j];
        }
    }
     //欧拉筛筛质数
    for(register int i=1;i<=N-10;i++)   v[i]=v[i-1]+(v[i]==i);
     //质数前缀和
}
inline void get(int len)
{
    int cnt=0;
    for(register int sta=N-160;sta>=1;sta--)
    {
        if(ans[len][v[sta+len-1]-v[sta-1]]) continue;
        cnt++;
        ans[len][v[sta+len-1]-v[sta-1]]=sta;
        if(cnt==len+1)  break;
    }   
    //对每一个 k 值进行预处理
}
int main()
{
    init();
    Q=read();
    for(register int i=1;i<=Q;i++)
    {
        k=read(),l=read(),m=read();
        if(k==l&&k<=m)
        {
            putchar('1');
            putchar('\n');
            continue;   
        }
        //情况一
        bool flag=false;
        for(register int j=max(1,m-k+2);j<=m;j++)   
            if(m-j+1+v[j+k-1]-v[m]==l)
            {
                write(j);
                putchar('\n');
                flag=true;
                break;
            }
        if(flag)    continue;
        //情况二
        if(!st[k])  st[k]=true,get(k);
        if(ans[k][l]>m) 
        {
            write(ans[k][l]);
            putchar('\n');
        }
        //情况三
        else
        {
            putchar('-');
            putchar('1');
            putchar('\n');
        }
        //无解
    }
    return 0;
}