P5834 [USACO19DEC]MooBuzz S 题解

清风雪月

2021-09-25 21:38:29

Personal

如果你没读过题目,那->传送门

这道题的题意可以这样理解,已知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;
}

评测记录

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;
}