进制转换末尾0问题

https://acm.ecnu.edu.cn/problem/3679/ 

3679. 进制转换

描述 统计 讨论区

单测试点时限: 2.0 秒

内存限制: 256 MB

“他觉得一个人奋斗更轻松自在。跟没有干劲的人在一起厮混,只会徒增压力。”

QQ 小方决定一个人研究研究进制转换。

很快,QQ 小方就遇到问题了。他现在想知道在十进制范围 [l,r] 内有多少整数满足在 k 进制下末尾恰好有 m 个 0 。

比如在十进制下的 24 在二进制下是 11000 ,我们称十进制下的 24 在二进制下末尾恰好有 3 个 0 。

QQ 小方一筹莫展,你能帮他解决问题吗?

输入

第一行包含一个整数 T (1≤T≤105 ) 表示数据组数。

对于每组数据包含一行,四个整数 l,r,k,m ( 1≤l≤r≤1018 , 2≤k,m≤100 ),含义如题目所述。

输出

对于每组数据输出一行,包含一个整数,表示答案。

样例

Input

2
1 10 2 3
1 100 2 3

Output

1
6

提示

例如,在 100 进制下,末位是 90 的数不算作有末尾 0 。

比赛死活做不出来。。。

#include <bits/stdc++.h>
#define ll long long int 
using namespace std;

int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		ll l,r,k,m;
		scanf("%lld%lld%lld%lld",&l,&r,&k,&m);
		ll ans1=0,ans2=0;
		ll n=m;
		l--;
		while(n){
			n--;
			l/=k;
			r/=k;
		} 
		ans1=r-r/k;
		ans2=l-l/k;
		printf("%lld\n",ans1-ans2);
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/87903692