2018ACM-ICPC中国大学生程序设计竞赛线上赛I. Reversion Count(数论&规律)

题目链接:https://nanti.jisuanke.com/t/26217

  •  26.87%
  •  1000ms
  •  65536K

 

Description:

There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1234, Y=4321. Z=(X-Y)/9, Judge if Z is made up of only one number(0,1,2...9), like Z=11,Z=111,Z=222,don't consider '+'and '-'.

Input:

Input contains of several test cases. Each test case only contains of a number X, L is the length of X. ( 2 <= L < 100)

 

Output:

Output “YES”or “NO”.

样例输入

10
13

样例输出

YES
YES

 

 

 

 

题意:给出一个数X,他的反序数是Y,判断(X-Y)/9的结果是不是只由一个数字组成。如:X=52121 Y=12125 (X-Y)/9=4444

 

解题思路:可以直接采用大数相加减然后模拟除法来做。我主要说下我找到的规律:

 

首先 一个数n与他反序数的差的绝对值,一定是9的倍数。证明如下:

 

设四位数 ABCD 他的反序数是DCBA

ABCD-DCBA=(1000*A+100*B+10*C+D)-(1000*D+100*C+10*B+A)

=(1000-1)*A+(100-10)*B-(100-10)*C-(1000-1)*D

=999*A+90*B-90*C-999*D

=(111*A+10*B-10*C-111*D)*9

 

再设五位数 ABCDE 他的反序数是 EDCBA

ABCDE-EDCBA=(10000*A+1000*B+100*C+10*D+E)-(10000*E+1000*D+100*C+10*B+A)

=9999*A+990*B+0*C-990*D-9999*E

=(1111*A+110*B-110*D-1111*E)*9

 

对于任一数都可以按此方法证明。

现在我们可以观察到 要想使最后结果全由同一个数字组成就取决于 除第一位与最后一位 剩余所有对称位置的数的值是否相等,若相等则一定是1,11,111,1111...的倍数,不等则一定不是。

如四位数ABCD, 111*A-111*D的结果一定是111的倍数,要使最后结果也是1,11,111,1111...的倍数那么10*B-10*C=10*(B-C)的结果一定要是0(你说B-C的结果可能是11的倍数(除0)???)

 

五位数 ABCDE, 1111*A-1111*E的结果一定是1111的倍数,注意观察到 凡是有奇数位的数最中间的那个数最后一定被消掉了,对于ABCDE来说就是C最后被消掉了,所以最后一定要(110*B-110*D)=(B-D)*110的值为0

 

另外1到3位数可以直接输出YES,因为他们的结果都是1位数

 

AC代码:

 

#include
#include

char str[110];

int main()
{
	while(~scanf("%s",str))
	{
		int l=strlen(str);
		if(l<=3)
		{
			printf("YES\n");
			continue;
		}
		int flag=1;
		for(int i=1;i<=l/2-1;i++)
		{
			if(str[i]!=str[l-1-i]) flag=0;
		}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

 

 

 

 

 

你可能感兴趣的:(ACM,笔记,数论只会GCD)