HDOJ 5255 魔法因子 (数学)

来源:互联网 发布:激光剑多少钱淘宝网 编辑:程序博客网 时间:2024/06/06 15:41

题意

给出一个x,求有多少个长度小于等于10位的数,乘以x之后最高位和最低位互换其他不变。

思路

因为只有两位是动的其他不动,所以我们令高位为high,低位为low,中间位是mid,那么我们能得到
(high10len1+mid+low)x=low10len1+mid+high
因为x是小数不好进行后面的判断,又因为x最多6位,我们令a = 1e6*x,b=1e6(注意这里因为精度误差,我们取a=1e6*x+eps
然后我们得到
mid=ahigh10len1+alowblow10len1bhighba
那么我们能得到mid必须满足mid末尾是0且长度小于i-1。

代码

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define LL long long#define Lowbit(x) ((x)&(-x))#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1|1#define MP(a, b) make_pair(a, b)const int INF = 0x3f3f3f3f;const int Mod = 1000000007;const int maxn = 12;const double eps = 1e-8;const double PI = acos(-1.0);LL ten[12];int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int T;    scanf("%d", &T);    ten[0] = 1;    for (int i = 1; i <= 12; i++)        ten[i] = ten[i-1] * (LL)10;    for (int ncase = 1; ncase <= T; ncase++)    {        double xx;        scanf("%lf", &xx);        LL a = (LL)(xx * 1000000 + eps);        LL b = (LL)1000000;        vector<LL> ans;        //printf("%I64d\n", a);        for (int i = 2; i <= 10; i++)        {            //printf("%I64d\n", ten[i-1]);            for (LL r = 1; r <= 9; r++)                for (LL l = 0; l <= 9; l++)                {                    LL temp = b * (l * ten[i-1] + r) - a * (r * ten[i-1] + l);                    if (temp % (10 * (a - b)) == 0)                    {                        //printf("%d\n", i);                        LL mid = temp / 10 / (a - b);                        //printf("%d\n", i);                        LL div = mid;                        if (div < 0) continue;                        int cnt = 0;                        while (div) cnt++, div /= 10;                        if (cnt <= i - 2) ans.push_back(r * ten[i-1] + 10 * mid + l);                    }                }        }        printf("Case #%d:\n", ncase);        printf("%d\n", ans.size());        for (int i = 0; i < ans.size(); i++)            if (!i) printf("%I64d", ans[i]);            else printf(" %I64d", ans[i]);        if (ans.size()) printf("\n");    }    return 0;}
0 0
原创粉丝点击