![]() |
#2
rjsp2025-04-30 20:29
1)“第一个大于等于a,且是X的倍数”的数是 (a/X)向上取整,然后乘以x
“第一个大于等于a,且是X的倍数,且不是100X倍数”的数是 (a/X)向上取整,如果它是100的倍数的话,再加一,然后乘以X 2)设第一个【X数】是1*X,那么Y是第几个【X数】? 答:因为每连续的100个【X的倍数】要被舍弃掉一个100X的倍数,所以Y是第 Y/X - Y/X/100 个【X数】 例如 1X 是第 1 个【X数】 例如 99X 是第 99 个【X数】 例如 101X 是第 100 个【X数】 错误的是,按上面的公式求得 -1X 是第 -1 个【X数】,这就不对了,既然设 1X 是第一个【X数】,那么 -1X 就应该是第0个【X数】。也就是负数的话,需要增加1。 3)求第n个【X数】是多少?也就是求2)的反函数 解:设结果是 (100p+q)X,其中 0<q<100 那么按照2)的结论有 (100p+q) - (100p+q)/100 = n,化简得 (n-q)/99 = p 例如求第100个【X数】,因为 (100-1)/99=1,即p=1,1=1,结果是 (1*100+1)X = 101X 例如求第99个【X数】,因为 (99-99)/99=1,即p=0,q=99,结果是 (0*100+99)X = 99X 例如求第0个【X数】,因为 (0-99)/99=-1,即p=-1,q=99,结果是 (-1*100+99)X = -X 例如求第-1个【X数】,因为 (-1-98)/99=-1,即p=-1,q=98,结果是 (-1*100+98)X = -2X ![]() #include <iostream> using namespace std; int main( void ) { size_t T; cin >> T; while( T-- ) { int x, a, b; cin >> x >> a >> b; // 求【第一个大于a的【x数】】是x的几倍 int t = (a>=0) ? (a+x-1)/x + ((a+x-1)/x%100==0) : a/x + (a/x%100==0); // 求 tx 是第几个【x数】 int m = t - t/100; m += m<0; // 求第 n 个【x数】是多少 int n = m + (b-1); int q = n%99==0 ? 99 : (n%99+99)%99; int p = (n-q)/99; int result = (p*100 + q)*x; cout << result << '\n'; } } |
的倍数,但是不是 100×X
的倍数,就说它是一个 X数。
有 T次询问,每次询问会给定一个整数 X,请问不小于 a的第 b小的 X数是多少?
输入格式
第一行一个整数 T
,表示询问次数。
接下来 T行,每行包含三个整数 X,a,b
输出格式
输出共 T行,每行包含一个整数表示当前询问的答案。
样例输入
3
10 1000 1
2 -10 2
1 100 10000
样例输出
1010
-8
10201
样例解释
当 X=10,a=1000时,不小于 1000的 X数从小到大依次是 1010,1020,...,所以第 1小的 X 数是 1010
当 X=2,a=−10时,不小于 −10的 X数从小到大依次是 −10,−8,..,所以第 2小的 X数是 −8。
数据范围
对于 20%的数据,保证 1≤b≤10
对于另外 30% 的数据,保证 1≤a,b≤1000
对于 100%的数据,保证 1≤T≤105,1≤X≤100,|a|≤109,1≤b≤109
本人知识储备还没有大家多,望大家多多关照,希望不要用过于高深的代码来解这道题,谢谢!
[此贴子已经被作者于2025-4-30 12:14编辑过]