洛谷 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;
}
本文来自博客园,作者:Black--Panda,转载请注明原文链接:https://www.cnblogs.com/liu-black/p/p8225-tijie.html