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

该博客介绍了如何判断一个整数是否能由11和111任意组合得出的方法。解法一是通过枚举111的倍数,检查剩余部分是否为11的倍数;解法二是应用Chicken McNugget定理,确定超过特定阈值的数都能构造。这两种算法都提供了有效的解决方案,并展示了在数值计算中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意
给你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;
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值