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

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #723 (Div. 2) B. I Hate 1111(找规律,性质)相关的知识,希望对你有一定的参考价值。

LINK

人被这题搞傻了

找找规律,发现

1111 = 11 ∗ 101 1111=11*101 1111=11101

11111 = 11 ∗ 1 0 3 + 111 11111=11*10^3+111 11111=11103+111

111111 = 11 ∗ 1 0 4 + 1111 111111=11*10^4+1111 111111=11104+1111

1111111 = 11 ∗ 1 0 5 + 11111 1111111=11*10^5+11111 1111111=11105+11111


综上所诉,后面的每个数都可以看成由若干个 11 11 11 111 111 111加和的值

所以问题转化为求 x = 11 ∗ a + 111 ∗ b x=11*a+111*b x=11a+111b是否存在正整数解

这个也许可以 e x g c d ? ? \\rm exgcd?? exgcd??我不是很懂,但是可以直接枚举 b b b

枚举 b b b的单次复杂度最坏是 1 0 7 10^7 107次,但是存在结论大于几千的数一定有解

所以完全跑不满,可以暴力枚举 b b b.

但是我们还是严谨一点,优化一下复杂度

注意到 111 = 11 ∗ 10 + 1 111=11*10+1 111=1110+1

所以而如果 b > = 11 b>=11 b>=11是没有意义的

因为 111 ∗ 11 = 11 + 11 ∗ 110 111*11=11+11*110 11111=11+11110

111 ∗ 12 = 11 ∗ 111 + 111 111*12=11*111+111 11112=11111+111

111 ∗ 13 = 11 ∗ 111 + 111 ∗ 2 111*13=11*111+111*2 11113=11111+1112

以此类推,发现是一个循环,所以 b b b只需要枚举到 11 11 11即可

其实这题打表找规律更好,发现大于几千的数都能被凑出来,于是完全背包处理小数据即可

#include <bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
	cin >> t;
	while( t-- )
	{
		int flag = 0;
		scanf("%d",&n );
		for(int i=0;i<=11;i++)
			if( i*111<=n && (n-i*111)%11==0 )	flag = 1;
		if( flag )	printf("YES\\n");
		else	printf("NO\\n");
	}
}

以上是关于Codeforces Round #723 (Div. 2) B. I Hate 1111(找规律,性质)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2), A. Mean Inequality

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

Codeforces Round #723 (Div. 2)