题目

题意略。

分析:这题我把式子各种展开,然后推了一个东西出来,枚举位数,然后求得一个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;
            }
        }
    }
}