UvaOJ 550 - Multiplying by Rotation

来源:互联网 发布:dnf n卡独显优化设置 编辑:程序博客网 时间:2024/04/26 14:40

题目

题意略。

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