【题目描述】
给定一个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
【题目分析】
水题,简单分析一下即可得出:每一位只需将快速幂后的结果向k-1取模,最后判断余数是否为0即可
【代码~】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e5+10;
char a[MAXN];
int ksm(int a,int b,int c)
{
int a1=a;
int ans=1;
while(b)
{
if(b&1)
ans=(ans*a1)%c;
a1=(a1*a1)%c;
b>>=1;
}
return ans;
}
int t,k;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&k);
scanf("%s",a);
int len=strlen(a),s=len;
int mo=0;
while(s--)
{
int now;
if(a[s]>='0'&&a[s]<='9')
now=a[s]-'0';
if(a[s]>='A'&&a[s]<='F')
now=a[s]-'A'+10;
mo=(mo+(now%(k-1))*ksm(k,len-s,k-1))%(k-1);
}
if(mo==0)
printf("yes\n");
else
printf("no\n");
}
}