Content
题面扯了一大堆空话。
真正的题意是:有 \(T\) 个询问,每次给出一个数 \(n\),求出 \((567n\div 9+7492)\times235\div47-498\) 的十位数。
数据范围:\(1\leqslant T\leqslant 100,-1000\leqslant n\leqslant 1000\)。
Solution
我们考虑把这个式子化简:
\((63n+7492)\times235\div47-498\)
\(=(63n+7492)\times5-498\)
\(=315n+37460-498\)
\(=315n+36962\)
所以,真正要求的东西就是这个式子:\(315n+36962\)。
那么如何求一个数的十位数呢?
很显然,设一个数是 \(x\),答案就是 \(|\left\lfloor\dfrac{x}{10}\right\rfloor\mod10|\)。
为什么?
因为在整除完 \(10\) 以后,得到的数就没有原来的数的个位数了,所以这时候再取模,相当于将前面所有的数位全部去除掉,只剩下我们要求的十位数。
特别注意负数的时候,因为十位数一定是一个非负整数,一定要取绝对值再去求。
所以,本题的答案就是 \(|\left\lfloor\dfrac{315n+36962}{10}\right\rfloor\mod10|\)。
Code
#include <cstdio>
#define abs(x) x < 0 ? -x : x
using namespace std;
inline int g() {
int f = 1, x = 0;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int main() {
int T = g();
while(T--) {
int x = g();
printf("%d\n", abs((315 * x + 36962) / 10 % 10));
}
return 0;
}