幸运数字

Posted lingr7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了幸运数字相关的知识,希望对你有一定的参考价值。

幸运数字

Alice认为4和7是幸运数字,并且如果一个数字是几个幸运数字的和,那么这个数字也是幸运数字,例如

  • 14=7+7
  • 18=7+7+4
  • 11=7+4
  • 7=7
    现在给你Q个数字,请你分别判断每个数字是否为幸运数字

    我的代码

#include<bits/stdc++.h>
using namespace std;
bool xnyp(long long x){
    if(x<4)
        return false;
    if(x==7 || x==4)
        return true; 
    else if(xnyp(x-7) || xnyp(x-4))
        return true;
    else return false;  
}
int main(void){
    int q;
    long long x;
    cin>>q;
    for(int i=0;i<q;i++){
        cin>>x;
        if(xnyp(x))
            cout<<"Yes"<<endl;
        else 
            cout<<"No"<<endl;  
    }
    return 0;
}

问题就在于大数怎么办?这种东西竟然是找规律
这个规律有两层。
一层是这样
x是幸运数,有一个数字7加出来的,那么这个数字7可以换成4+4,那么x+1也是幸运数。
如果有7个4呢,那么就有4个7,可以替换4次,那么x,x+1,x+2,x+3,x+4都是幸运数,那么28是幸运数字,29 30 31 32 也都是,而32里面也有7个4啊,类推,33 34 34 36 都是幸运数。
那么28以后必然是幸运数字。
接下来是室友想出来的,继续缩小范围的方法。
幸运树必然x==3m+4n的样式。
那么如果m>=n,必然是幸运数字。
如果m<n呢?(为了寻找不幸运的数字)
取,n 为1,2,3,然后,1,m取0,1 3,m取0,1,2,那么找到的17是最大的不幸运数字。
取n等于4,那么m可以0,1,2,3
16 19 22 25,发现全是幸运数字了。

代码

#include<bits/stdc++.h>
using namespace std;
int a[]={1,2,3,5,6,9,10,13,17};

int main(void){
    int q;
    long long x;
    bool flag=true;
    cin>>q;
    for(int i=0;i<q;i++){
        cin>>x;
        flag = true;
        for(int j=0;j<9;j++){
            if(x==a[j]){
                flag = false;
                break;
            }
        }
        if(flag)
            cout<<"Yes"<<endl;
        else 
            cout<<"No"<<endl;  
    }
    return 0;
}

以上是关于幸运数字的主要内容,如果未能解决你的问题,请参考以下文章

将给定数字转换为幸运数字所需的最小移动次数[关闭]

CSDN - CSDN27题解

CSDN - CSDN27题解

bzoj1853幸运数字——容斥原理

SCOI2016 幸运数字

幸运数字1