P1062 [NOIP2006 普及组] 数列
#include <bits/stdc++.h>
using namespace std;
int k, n, a[10], cnt;
long long ans;
int main()
{
scanf("%d %d", &k, &n);
//将n转换为二进制数, 最低位存在a[0]
while(n){
a[cnt]=n%2;
cnt++;
n>>=1;
}
for(int i=0; i<cnt; ++i){
if(a[i]){
ans+=pow(k, i);
}
}
printf("%lld", ans);
return 0;
}
B2141 确定进制
#include <bits/stdc++.h>
using namespace std;
long long p, q, r, temp, temq, a[200], b[200], numr[200], ans[200], cnt1, cnt2, cnt3, mn;
//验证 asd 进制下 p*q 是否等于 r
bool mul(long long asd)
{
long long c=0;
memset(ans, 0, sizeof(ans));
//高精度乘法
for(long long i=1; i<=cnt1; ++i){
for(long long j=1; j<=cnt2; ++j){
ans[i+j-1]+=a[i]*b[j];
if(ans[i+j-1]>=asd){
ans[i+j]+=ans[i+j-1]/asd;
ans[i+j-1]%=asd;
}
}
}
//将 asd 进制下 p*q 的值转换为十进制 c
for(long long i=cnt1+cnt2; i>=1; --i){
c=c*asd+ans[i];
}
//计算 asd 进制下 r 的值
r=0;
for(long long i=cnt3; i>=1; --i){
r=r*asd+numr[i];
}
//判断是否相等
return c==r;
}
int main()
{
scanf("%lld %lld %lld", &p, &q, &r);
//将 p、q数位分离,确定可能的最小进制,避免无效操作
temp=p;
temq=q;
while(temp){
cnt1++;
a[cnt1]=temp%10;
mn=max(mn, a[cnt1]+1);
temp/=10;
}
while(temq){
cnt2++;
b[cnt2]=temq%10;
mn=max(mn, b[cnt2]+1);
temq/=10;
}
//将 r 数位分离,便于计算为任意进制的数
while(r){
cnt3++;
numr[cnt3]=r%10;
r/=10;
}
//枚举不同进制
for(long long i=mn; i<=16; ++i){
if(mul(i)){
printf("%lld\n", i);
return 0;
}
}
printf("0");
return 0;
}