【2018/10/04测试T1】【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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值