打卡信奥刷题(3293)用C++实现信奥题 P9002 [RC-07] 心跳
P9002 [RC-07] 心跳题目描述对正整数xxx设f(x,B)f(x,B)f(x,B)表示xxx在BBB进制下的数位和。说一个正整数ppp是BBB-好的当且仅当对于任意正整数qpqpqp都有f(p,B)≥f(q,B)f(p,B)\ge f(q,B)f(p,B)≥f(q,B)。给定正整数nnn和BBB计算有多少个≤n\le n≤n的正整数是BBB-好的。输入格式本题单个测试点内有多组数据。第一行是数据组数TTT。接下来TTT行每行两个正整数n,Bn,Bn,B。输出格式输出TTT行每行一个非负整数为答案。输入输出样例 #1输入 #16 4 2 9 3 1000 2 1000 20 28238934 154154154154154 23389348458425 5输出 #13 6 49 60 28238934 760说明/提示样例解释这里只解释第二组询问的输出。三进制下1,2,3,4,5,6,7,8,91,2,3,4,5,6,7,8,91,2,3,4,5,6,7,8,9的数位和分别为1,2,1,2,3,2,3,4,11,2,1,2,3,2,3,4,11,2,1,2,3,2,3,4,1据此容易看出只有1,2,4,5,7,81,2,4,5,7,81,2,4,5,7,8是333-好的所以输出666。数据范围所有数据均满足1≤T≤1051\le T\le 10^51≤T≤1051≤n≤10181\le n\le 10^{18}1≤n≤10182≤B≤10182\le B\le 10^{18}2≤B≤1018。子任务111505050分T≤104T\le 10^4T≤104n,B≤100n,B\le 100n,B≤100。子任务222303030分B2B2B2。子任务333202020分无特殊限制。C实现#includebits/stdc.husingnamespacestd;#defineLLlonglongconstintN65;intT;LL n,B,now,ans,num[N];inlinevoidsolve(){scanf(%lld%lld,n,B);now0;while(n)num[now]n%B,n/B;ans(B-1)*now*(now-1)/2(num[now]-1)*now;for(intinow-1;i1;i--){if(num[i]B-1)ans(i1)1;elseif(num[i]B-2){boolflagtrue;for(intji-1;j1;j--)if(num[j]!B-1){flagfalse;break;}if(flag)ans;break;}elsebreak;}printf(%lld\n,ans(now1));}intmain(){scanf(%d,T);while(T--)solve();return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容