1. 程式人生 > >【2018/10/04】【WOJ 4036】K進位制

【2018/10/04】【WOJ 4036】K進位制

【題目】

題目描述:

給定一個 K(2 ≤ K ≤ 16)進位制數 a,判斷 a 是否能被 K-1 整除。

輸入格式:

第一行是一個整數 t(1 ≤ t ≤ 50),表示測試點數量。

對於每組資料,第一行一個整數 K,表示進位制。

第二行一個 K 進位制數,表示 a。保證 a 是合法的 K 進位制數,沒有前導 0,且只由 0 - 9 、A - F 構成。

輸出格式:

如果 a 可以被 K-1 整除,輸出 “yes”,否則輸出 “no”。

樣例資料:

輸入

2
16
2D
10
19

輸出

yes
no

備註:

對於 40% 的資料,a 的長度不超過 5。

對於 100% 的資料,a 的長度不超過 100000。

【分析】

首先很容易可以推出 K^n \: mod\: (K-1)=1

那麼對於一個 K 進位制數,它的 K^n 就直接可以丟掉(模 K-1 等於 1)

因此累加每一位上的數,判斷模 K-1 是否等於 0 就可以了

【程式碼】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
char s[N];
int main()
{
//	freopen("kbased.in","r",stdin);
//	freopen("kbased.out","w",stdout);
	int n,i,k,l;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&k);
		scanf("%s",s+1);
		l=strlen(s+1);
		int sum=0;
		for(i=1;i<=l;++i)
		{
			if(s[i]>='0'&&s[i]<='9')  sum+=s[i]-'0';
			if(s[i]>='A'&&s[i]<='F')  sum+=s[i]-'A'+10;
		}
		if(sum%(k-1)==0)  printf("yes\n");
		else  printf("no\n");
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}