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=a∗m+b∗n。a>=0,b>=0
其中不能构造的最大的数是
n
∗
m
−
n
−
m
n*m-n-m
n∗m−n−m,大于
n
∗
m
−
n
−
m
n*m-n-m
n∗m−n−m的数,都可以通过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(思维,数学)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #723 (Div. 2)B. I Hate 1111
Codeforces Round #723 (Div. 2)B. I Hate 1111(完全背包)