小国的游戏(素数打表+快速幂+同余定理+约分)

小国的游戏
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 92 Solved: 25
[Submit][Status][Discuss]
Description

可怜的小国和小辉在双十一过后,吃饭都吃不起了,只能在吃饭时间玩会游戏来打发时间。可是时间久了之后,他们各种游戏都玩了一遍,所以他们两个打算合作出一个新奇的游戏。最终,他们决定先做四个纸箱,每个纸箱里面放1000张卡片,每张卡片上写一个数字。
小国从不同的两个纸箱里抽两张卡片,卡片上的数字是a和b,小辉从另外两个不同的纸箱里抽两张卡片,卡片上的数字是c和d。然后两个人分别用特定的计算方法计算一个结果。计算方法是小国计算a^b的值,然后将该值的各位数字的和计算出来,小辉计算c^d的值,然后将该值的各位数字的和计算出来,如果他们各自得到的和不是一位数,那么继续分别计算各自的各个位数的和。最后小国将他计算出来的数字扩大2017倍,然后用新得到值的素因子和作为分子,小辉将他计算出来的数字扩大1203倍,然后用新得到的值的素因子和作为分母,得出一个分数,并且将这个分数化简为最简分数。
可是小辉和小国的数学都很差,想请热爱编程的你帮忙计算这个最简分数。

Input

输入T(1<=T<=50),表示有T组输入
接下来T行数据,每行有四个整数a,b,c,d(0

int pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)
            ans=(ans%9*a%9)%9;
        a=(a%9*a%9)%9;
        b>>=1;
    }
    return ans;
}

素数打表:

void f()
{
    check[1]=1;
    for(int i=2;i*i<=100000;i++)
        if(!check[i])
          for(int j=i*i;j<=100000;j+=i)
            check[j]=1;
}

下面是总代码

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int check[100000]={0};
void f()
{
    check[1]=1;
    for(int i=2;i*i<=100000;i++)
        if(!check[i])
          for(int j=i*i;j<=100000;j+=i)
            check[j]=1;
}
int pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)
            ans=(ans%9*a%9)%9;
        a=(a%9*a%9)%9;
        b>>=1;
    }
    return ans;
}
int main()
{
   int t,a,b,c,d,ans1,ans2;
   int aa,bb,cc;
   f();
   cin>>t;
   while(t--)
   {
       aa=0;
       bb=0;
       scanf("%d%d%d%d",&a,&b,&c,&d);
       ans1=pow(a,b);
       ans2=pow(c,d);
       if(ans1==0)
        ans1=9;
       if(ans2==0)
        ans2=9;
       ans1=ans1*2017;
       ans2=ans2*1203;

       for(int i=2;i<=ans1;i++)
        if(check[i]==0&&ans1%i==0)
           aa+=i;


        for(int i=2;i<=ans2;i++)
            if(check[i]==0&&ans2%i==0)
              bb+=i;

        cc=__gcd(aa,bb);

        printf("%d/%d\n",aa/cc,bb/cc);


   }






    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41700151/article/details/80464974