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");
	}
}