【NOIP2021 報數】題解
阿新 • • 發佈:2021-11-24
題目連結
想著T2,T3的題解都寫了,就補一下T1的吧。
典型的篩法。
假如一個數含有7,則把它的倍數全篩走。
這裡可以加一個小優化,假如這個數已經被篩過,就不需要再篩它的倍數了。
最後再倒著預處理每個數的下一個沒被篩的是什麼。
如果不預處理,不斷6999999就可以卡死你。
Code
#include<bits/stdc++.h> using namespace std; //#define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar(); }while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}return x*f;} //#define M //#define mo #define N 10000050 int n, m, i, j, k; int f[N], s[N], t, x; int pan(int x) { while(x) { if(x%10==7) return 1; x/=10; } return 0; } signed main() { // freopen("number.in", "r", stdin); // freopen("number.out", "w", stdout); for(i=1; i<=10000005; ++i) { if(pan(i)) { if(!f[i]) for(j=i; j<=10000005; j+=i) f[j]=1; } // if(!f[i]) printf("%d\n", i); } for(i=10000005; i>=1; --i) { if(!f[i]) s[i]=i; else s[i]=s[i+1]; // printf("s[%d]=%d\n", i, s[i]); } t=read(); while(t--) { x=read(); if(f[x]) printf("-1\n"); else printf("%d\n", s[x+1]); } return 0; }