B - I Hate 1111(思维,数学)

Posted zjj0624

tags:

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

题意
给你T组数据,每组数据给一个x,问你是否可以用任意数量的11,111,1111,11111…来表示出x。
例子:144=111+11+11+11.
思路
解法1:
我们通过找规律可以发现,除了11和111,剩下的1111,11111…都可以通过11和111来构造出来,所以我们这题的关键就是求x是否能被11和111构造出来。
x=11a+111b。 a>=0,b>=0;
而b又可以转换成 b=c11+d d<11.
所以x=11
(a+111c)+111d,d<11
我们可以通过枚举d的值,来判断x-111*d是不是11的倍数,最多也只会枚举11次,所以是可以过的。

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6+10;
    const int MOD = 1e9+7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int x;
            cin>>x;
            bool flag=false;
            for(int i=0 ; i*111<=x ; i++)
            {
                if(i>11) break;
                if((x-i*111)%11==0)
                {
                    flag=true;
                    break;
                }
            }
            if(flag) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }

解法二:
Chicken McNugget Theorem:两个互质的数n,m。
x = a ∗ m + b ∗ n 。 a > = 0 , b > = 0 x=a*m+b*n。a>=0,b>=0 x=am+bna>=0,b>=0
其中不能构造的最大的数是 n ∗ m − n − m n*m-n-m nmnm,大于 n ∗ m − n − m n*m-n-m nmnm的数,都可以通过m和n构造出来。
然后我们来看这个题,我们知道我们是用11和111来构造x, g c d ( 11 , 111 ) = 1 gcd(11,111)=1 gcd(11,111)=1,我们知道,当11*111-11-111=1099,当x大于1099的时候,都可以通过11和111构造出来,当x小于11和111的时候,我们就可以暴力的判断。

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6+10;
    const int MOD = 1e9+7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int x;
            cin>>x;
            if(x>1099)
            {
                cout<<"YES"<<endl;
                continue;
            }
            bool flag=false;
            for(int i=0 ; i*111<=x ; i++)
            {
                if((x-i*111)%11==0)
                {
                    flag=true;
                    break;
                }
            }
            if(flag) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }

以上是关于B - I Hate 1111(思维,数学)的主要内容,如果未能解决你的问题,请参考以下文章

B. I Hate 11111400 / 思维 规律

Codeforces Round #723 (Div. 2)B. I Hate 1111

Codeforces Round #723 (Div. 2)B. I Hate 1111(完全背包)

Codeforces Round #723 (Div. 2) B. I Hate 1111(找规律,性质)

I love you 的数学代码

B - I Hate It