UVa 11344 The Huge One(モード特性)

1385 ワード

http://uva.onlinejudge.org/index.php?option=com_オンラインjudge&Itemid=8&category=24&page=show_problem&problem=2319
簡単な点の方法:a*10%m=(℃)*10)%mなので、一つの数を数えて一つずつ型を取って判断すればいいです.
複雑な点の方法:
1.判断は不要です
2.もし1つの整数の未尾三桁が8で割り切れるなら、この数は8で割り切れる.
一つの整数の末尾の二桁が4で割り切れると、この数は4で割り切れる. 
一つの整数の位置が2で割り切れると、この数は2で割り切れる.
3. 一つの整数の数字と9で割り切れると、この整数は9で割り切れる. 
整数の数字が3で割り切れると、この整数は3で割り切れる.
4. 一つの整数が2と3で割り切れるなら、この数は6で割り切れる.
整数が3と4で割り切れるなら、この数は12で割り切れる. 
5. 整数の末尾が0なら、この数は10で割り切れる.
整数の末尾が0または5の場合、この数は5で割り切れる.
6. 7、11で割り算されたと判定する簡単な方法です.
7.判定回数を簡略化する:
8 okであれば、4,2 okです.
9 okであれば、3 okです
2,3 okであれば、6 okです
3,4 okであれば、12 okです.
10 okであれば、5 okです
完全コード:
/*0.022s*/

#include<cstdio>
#include<cstring>

char s[1005];
int a[15];

int main()
{
	int t, len, n, i, j, rem;
	bool f;
	scanf("%d", &t);
	while (t--)
	{
	    getchar();
		gets(s);
		len = strlen(s);
		scanf("%d", &n);
		for (i = 0; i < n; ++i)
			scanf("%d", &a[i]);
		f = false;
		for (i = 0; i < n; ++i)
		{
			rem = 0;///remainder
			for (j = 0; j < len; ++j)
				rem = (rem * 10 + (s[j] & 15)) % a[i];
			if (rem)
			{
				f = true;
				break;
			}
		}
		if (f) printf("%s - Simple.
", s); else printf("%s - Wonderful.
", s); } return 0; }