P5834 [USACO19DEC]MooBuzz S 题解

清风雪月

2021-09-25 21:38:29

Personal

如果你没读过题目,那->[传送门](https://www.luogu.com.cn/problem/P5834) ------------ 这道题的题意可以这样理解,已知n,求第n个既不是3的倍数也不是5的倍数的数。 ------------ 这么简单,于是...... ``` //~柠月~ #include<bits/stdc++.h> using namespace std; int n,x; int main() { cin>>n; int i=1,j=0; while(j<n) { if(i%3!=0&&i%5!=0) { j++; x=i; } i++; } cout<<x<<endl; return 0; } ``` [评测记录](https://www.luogu.com.cn/record/58572370) emmm......35分真酸爽 当然,这个早就考虑过了 那么,打表?当然不可能。 因此我们需要找规律。 ------------ 为了弄清楚规律,我们可以编一个程序来看看序列。(m==Moo);\ 1 2 m 4 m m 7 8 m m 11 m 13 14 m 16 17 m 19 m m 22 23 m m 26 m 28 29 m 31 32 m 34 m m 37 38 m m 41 m 43 44 m 于是我们发现,Moo的位置重复了。根据这个规律,我们发现,每15个数字一个循环,而其中有8个非Moo的。 1 2 4 7 8 11 13 14 再看看第二轮的第一个16,1+15?没错了,这样子我们就可以得出一个公式 第n个等于(n-1)/8* 15+第一轮的第n%8个数字(其中为0即为14) ------------ 那么,接下来就要上代码了(复制之前记得先看完解析哦) ``` //~柠月~ #include<bits/stdc++.h> using namespace std; int n,x; int main() { cin>>n; x=(n-1)/8; n%=8; switch(n) { case 0:cout<<14+x*15<<endl;break; case 1:cout<<1+x*15<<endl;break; case 2:cout<<2+x*15<<endl;break; case 3:cout<<4+x*15<<endl;break; case 4:cout<<7+x*15<<endl;break; case 5:cout<<8+x*15<<endl;break; case 6:cout<<11+x*15<<endl;break; case 7:cout<<13+x*15<<endl;break; } return 0; } ```