1. 程式人生 > >NOIP 2018.10.4

NOIP 2018.10.4

快速冪一位一位算就行了,開long long超時一個點??

#include<bits/stdc++.h>
using namespace std;
char a[100010];
int rest,now,K,t;
int quick_pow(int a,int b,int mod){
	int ret=1;
	while(b){
		if(b&1) ret=ret*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ret;
}
int main(){
/*	freopen("kbased.in","r",stdin);
	freopen("kbased.out","w",stdout);*/
	scanf("%d",&t);
	while(t--){
		rest=0;
		scanf("%d",&K);
		scanf("%s",a);
		int len=strlen(a);
		for(int i=len-1;i>=0;--i){
			if(a[i]>='0'&&a[i]<='9') now=a[i]-'0';
			if(a[i]>='A'&&a[i]<='F') now=a[i]-'A'+10;
			rest=(rest+quick_pow(K,len-i-1,K-1)*now)%(K-1);
		}
		if(rest==0) printf("yes\n");
		else printf("no\n");
	}
	return 0;
}

————————————————————————————————————————————————————————