欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【t090】吉祥数

程序员文章站 2024-01-31 08:30:46
...

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给
每位同学发一张卡片,每张卡片上都有一个编号(此编号为非负数,且小于255),每个编号互不相同。老师制定了以下的游戏规
则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局
,第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,
余下的同学再将编号的各位数字进行4次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经
过n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2007年吉祥数。(假定班级人数不超过200人)
【输入格式】

输入文件ghillie .in 有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。

【输出格式】

输出文件ghillie .out是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。

Sample Input

1
24 123 2 12 20 14 4 6 36 72

Sample Output

2 6 12 24 72 123

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t090

【题解】

单独写个函数计算某个数字在第x回合各个位上的数字的x+1方和;
然后就模拟呗;
平台日常卖萌:
如果回合数小于3.最后的数字末尾有多余的空格;
回合数大于等于3,最后的数字末尾没有多余的空格。

【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

void rel(LL &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t) && t!='-') t = getchar();
    LL sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

void rei(int &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t)&&t!='-') t = getchar();
    int sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

const int MAXN = 200+100;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);

int T;
LL a[MAXN];
int n = 0;
vector <LL> b;
bool bo[MAXN];

LL f(LL x,int round)
{
    LL temp = 0;
    while (x>0)
    {
        int t = x%10;
        LL dd = 1;
        rep1(i,1,round+1)
            dd=dd*t;
        temp+=dd;
        x/=10;
    }
    return temp;
}

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    memset(bo,true,sizeof(bo));
    rei(T);
    LL x;
    while (scanf("%I64d",&x)!=EOF)
        a[++n] = x;
    rep1(ii,1,T)
    {
        b.clear();
        rep1(i,1,n)
            if (bo[i])
                b.pb(f(a[i],ii));
        int len = b.size();
        rep1(i,1,n)
            if (bo[i])
            {
                rep1(j,0,len-1)
                    if (b[j]==a[i])
                    {
                        bo[i]=false;
                        break;
                    }
            }
    }
    b.clear();
    rep1(i,1,n)
        if (bo[i])
            b.pb(a[i]);
    sort(b.begin(),b.end());
    int len = b.size();
    rep1(i,0,len-1)
    {
        printf("%I64d",b[i]);
        if (i==len-1)
            {
                if (T<3) putchar(' ');
                puts("");
            }
        else
            printf(" ");
    }
    return 0;
}