题目
题意略。
分析:这题我把式子各种展开,然后推了一个东西出来,枚举位数,然后求得一个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进制。
代码:
#includeTLE的代码:#include #include 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;}
#includeusing 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< <