题目
题意略。
分析:这题我把式子各种展开,然后推了一个东西出来,枚举位数,然后求得一个x,若x能表示为当前总位数减一的base下的数,则当前位数为最小。这样写了后TLE了,判断那里可能耗时了。
看了别人的题解后,发现我考虑复杂了。其实这就是一个base位进制下的多位数乘以一位数的乘法运算。写成竖式如下,
a0a1a2...an-1c
× f
----------------------
ca0a1a2...an-1
(a0a1a2...an-1c 表示 factor1,f表示factor2,c为需要移动的数字)。
运算过程如,c*f 为最低位运算后的结果 c*f 在base下表示为 c*f/base、(c*f)%base 两位数,其中c*f/base为进位,c*f%base为结果的当前位,由题目条件知,an-1 = c*f%base.
所以我们继续进行an-1*f,直到结果的当前位等于c,且进位为0。可见这就是小学时给的那种竖式留几个空叫你填空的那种题目,只不过由十进制改成了base进制。
代码:
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main() {
int base, n, m;
while(cin >> base >> n >> m) {
if(m == 1) {
cout << 1 << endl;
continue;
}
int carry = 0, cur = n, i = 1;
for(; ; i++) {
int tmp = cur * m + carry;
carry = tmp / base; //满base进一
cur = tmp % base; //当前位
if(carry == 0 && cur == n) {
cout << i << endl;
break;
}
}
}
return 0;
}
TLE的代码:
#include<iostream>
using namespace std;
int b, c, f;
int is(int x, int n) //x能否表示成b下的n位数
{
int cnt=0;
for(; x; x/=b, cnt++);
if(cnt == n) return 1;
else return 0;
}
int main()
{
while(cin>>b>>c>>f)
{
int i; //first factor的位数 n
int b_pow = 1; //b的n-1次
for(i=1; b_pow<=f; i++) b_pow*=b; //①n能不能为1?②<=,x不能为0?
for(; ; i++, b_pow*=b)
{
int t1 = c*(b_pow-f);
int t2 = (f*b-1);
if(t1%t2 != 0) continue; //x为整数
int x = t1/t2;
if(is(x, i-1))
{
cout<<i<<endl;
break;
}
}
}
}