NOIP2021题解~持续更新
生活随笔
收集整理的這篇文章主要介紹了
NOIP2021题解~持续更新
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、報數(shù)
題目大意是將所有包含數(shù)字7的數(shù)的倍數(shù)(如7、14、17、27等)全部篩去,然后輸入某個數(shù)字,輸出這個數(shù)字的下一個不是倍數(shù)的數(shù)字(如輸入6,輸出8,不能是7)。T次詢問。
1 < = x < = 1 × 1 0 7 1<=x<=1 \times10^7 1<=x<=1×107
1 < = T < = 2 × 1 0 5 1<=T<=2 \times10^5 1<=T<=2×105
顯然需要預(yù)處理,先把所有包含數(shù)字7的數(shù)字找出來,利用歐拉篩的思想,將所有倍數(shù)都篩出。然后用數(shù)組標(biāo)記一下每個數(shù)的下一個數(shù)是什么即可。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int MAXN = 10000001; int T; int num[MAXN],nxt[MAXN]; bool vis[MAXN];bool pd(int x){while(x){int t = x % 10;x /= 10;if(t == 7) return true;}return false; } void solve(){int x, tot = 0;cin >> T;for(int i = 1;i <= MAXN;i ++){if(pd(i)){num[++ tot] = i;vis[i] = 1; }}for(int i = 1;i <= MAXN;i ++){for(int j = 1;j <= tot && i * num[j] <= MAXN;j ++){vis[i * num[j]] = 1;if(i % num[j] == 0) break;}}int pre = 0;for(int i = 1;i <= MAXN;i ++){if(vis[i] == 0){nxt[pre] = i;pre = i;}}while(T --){scanf("%d",&x);if(vis[x]) cout << "-1" << endl;else cout << nxt[x] << endl;}return; } int main(){solve();return 0; }總結(jié)
以上是生活随笔為你收集整理的NOIP2021题解~持续更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在office中插入特殊符号方框带√
- 下一篇: 【文科生带你读JavaScript数据结