洛谷 P8225 题解

题目传送门


题意:

定义一个十进制数为 \(k\) 阶天才数,并且需要满足:

  • 该整数的位数\(k\) 的倍数。

  • 每一个数位都是 \(9\)

\(t\) 次询问,每次询问给出 \(n\)\(k\),求 \(n\) 是否可以拆分成若干个 \(k\) 阶天才数的和。


思路:

  • 题目求的是 \(n\) 是否可以被 \(k\) 阶天才数整除,我们可以用 \(n\) 取模 \(k\) 阶天才数。

  • 例如 \(k=3\) 时,\(999,999999...\) 这些数都是可以的,但是 \(n\) 只要可以被最小的 \(k\) 阶天才数整除,那么答案就是可以的。

  • 我们再看 \(k\) 的范围是 \(1≤k≤10\),所以我们可以用打表的方式,将 \(10\) 个不同范围的 \(k\) 阶天才数存到数组里,每次询问分别取模就可以了,这样我们就可以做到每次询问都是 \(O(1)\) 的时间复杂度。


code:

#include <bits/stdc++.h>
using namespace std;

long long ans[15]={0,9,99,999,9999,99999,999999,9999999,99999999,999999999,9999999999};

inline long long read(){
	long long x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}

long long t,n,k,s;

int main(){
	t=read();
	while(t--){
		k=read();n=read();
		if(n%ans[k]==0)	cout<<"aya"<<endl;
		else cout<<"baka"<<endl;
	}
	return 0;
}


posted @ 2022-04-05 17:49  Black--Panda  阅读(60)  评论(0编辑  收藏  举报