P7893 『JROI-3』Reversi 题解
PART 0:说些闲话
这是去年十月份打的比赛,应该算我打的第一场月赛吧,最近突然想起来就来看看,发现还可以交题解就写一篇。
我才不会说是来贺快读模板的呢
PART 1:题目大意
在
PART 2:解题思路
首先阐述一下我们的策略,从大往小去选,一旦这个数
当时水平太弱,误打误撞写出了正解,现在来想想为什么这样是对的?
原因很简单。我们依照这种方式,可以把
但是这样实现起来似乎很复杂,有没有什么简单的方式呢?
当然是有的,这里先放出代码来:
long long ans = 0;
for(long long i = 1; n > 0; i = -i, n /= p){
ans += i * n;
}
printf("%lld\n",ans)
模拟一下即可理解:先加上
PART 3:完整代码
#include<bits/stdc++.h>
#define MAXN 1000010
using namespace std;
long long t,n,p;
bool vis[MAXN];
inline long long read(){
long long s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
int main(){
t = read();
while(t--){
n = read(); p = read();
if(p == 1){
printf("0\n");
continue;
}
long long ans = 0;
for(long long i = 1; n > 0; i = -i, n /= p){
ans += i * n;
}
printf("%lld\n",ans);
}
}