日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数)

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題干:

單測試點(diǎn)時(shí)限: 2.0 秒

內(nèi)存限制: 256 MB

“他覺得一個(gè)人奮斗更輕松自在。跟沒有干勁的人在一起廝混,只會(huì)徒增壓力。”

QQ 小方?jīng)Q定一個(gè)人研究研究進(jìn)制轉(zhuǎn)換。

很快,QQ 小方就遇到問題了。他現(xiàn)在想知道在十進(jìn)制范圍 [l,r] 內(nèi)有多少整數(shù)滿足在 k 進(jìn)制下末尾恰好有 m 個(gè) 0 。

比如在十進(jìn)制下的 24 在二進(jìn)制下是 11000 ,我們稱十進(jìn)制下的 24 在二進(jìn)制下末尾恰好有 3 個(gè) 0 。

QQ 小方一籌莫展,你能幫他解決問題嗎?

輸入

第一行包含一個(gè)整數(shù) T (1≤T≤105 ) 表示數(shù)據(jù)組數(shù)。

對(duì)于每組數(shù)據(jù)包含一行,四個(gè)整數(shù) l,r,k,m ( 1≤l≤r≤1018 , 2≤k,m≤100 ),含義如題目所述。

輸出

對(duì)于每組數(shù)據(jù)輸出一行,包含一個(gè)整數(shù),表示答案。

樣例

Input

2 1 10 2 3 1 100 2 3

Output

1 6

提示

例如,在 100 進(jìn)制下,末位是 90 的數(shù)不算作有末尾 0 。

解題報(bào)告:

然后作差就行了。

但是注意這題要處理高精度問題。處理方法有兩個(gè),要么變乘法為除法,要么換范圍更大的整數(shù)(選稍微比longlong大一點(diǎn)的就可以了)

AC代碼1:

#include<cstdio> #include<assert.h> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define fi first #define se second #define pb push_back #define pm make_pair using namespace std; const int MAX = 2e2 + 6; const ll INF = 0x3f3f; ll l,r,k,m; unsigned ll tmp; unsigned ll cal(unsigned ll x) {unsigned ll res = 0;res = x / tmp;if(tmp * k <= x && tmp*k >= 0) res -= x/(tmp*k) ;return res; } int main() {int t,n;cin>>t;while(t--) {scanf("%lld%lld%lld%lld",&l,&r,&k,&m);tmp = 1;int flag = 1;for(int i = 1; i<=m; i++) {tmp *= k;if(tmp > r || tmp < 0) {flag = 0; break;}}if(!flag) {printf("0\n");continue;}printf("%lld\n",cal(r) - cal(l-1));} return 0 ;}

AC代碼2:

#include<bits/stdc++.h> #define ll long long using namespace std; int get(ll x,int k) {int res=0;while(x){res++;x/=k;}return res; } int main() {int T,k,m;scanf("%d",&T);while(T--){ll l,r;scanf("%lld%lld%d%d",&l,&r,&k,&m);int tmp=get(r,k);if(tmp<=m){puts("0");continue;}ll x=pow(1ll*k,m);ll ans=r/x-(l-1)/x;if(r/x>=k)ans-=(r/(x*k)-(l-1)/(x*k));printf("%lld\n",ans);} }

或者使用Python:

T=int(input()) for i in range(T):l,r,k,m=map(int,input().split())now=k**ma=now*kprint((r//now-(l-1)//now)-(r//a-(l-1)//a))

?

總結(jié)

以上是生活随笔為你收集整理的【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。