zoukankan      html  css  js  c++  java
  • 机器人M号

    Description
    3030年,Macsy正在火星部署一批机器人。 第1秒,他把机器人1号运到了火星,机器人1号可以制造其他的机器人。 第2秒,机器人1号造出了第一个机器人——机器人2号。 第3秒,机器人1号造出了另一个机器人——机器人3号。 之后每一秒,机器人1号都可以造出一个新的机器人。第m秒造出的机器人编号为m。我们可以称它为机器人m号,或者m号机器人。 机器人造出来后,马上开始工作。m号机器人,每m秒会休息一次。比如3号机器人,会在第6,9,12,……秒休息,而其它时间都在工作。 机器人休息时,它的记忆将会被移植到当时出生的机器人的脑中。比如6号机器人出生时,2,3号机器人正在休息,因此,6号机器人会收到第2,3号机器人的记忆副本。我们称第2,3号机器人是6号机器人的老师。 如果两个机器人没有师徒关系,且没有共同的老师,则称这两个机器人的知识是互相独立的。注意:1号机器人与其他所有机器人的知识独立(因为只有1号才会造机器人),它也不是任何机器人的老师。 一个机器人的独立数,是指所有编号比它小且与它知识互相独立的机器人的个数。比如1号机器人的独立数为0,2号机器人的独立数为1(1号机器人与它知识互相独立),6号机器人的独立数为2(1,5号机器人与它知识互相独立,2,3号机器人都是它的老师,而4号机器人与它有共同的老师——2号机器人)。 新造出来的机器人有3种不同的职业。对于编号为m的机器人,如果能把m分解成偶数个不同奇素数的积,则它是政客,例如编号15;否则,如果m本身就是奇素数或者能把m分解成奇数个不同奇素数的积,则它是军人,例如编号 3, 编号165。其它编号的机器人都是学者,例如编号2, 编号6, 编号9。 第m秒诞生的机器人m号,想知道它和它的老师中,所有政客的独立数之和,所有军人的独立数之和,以及所有学者的独立数之和。可机器人m号忙于工作没时间计算,你能够帮助它吗? 为了方便你的计算,Macsy已经帮你做了m的素因子分解。为了输出方便,只要求输出总和除以10000的余数。

    Input
    输入文件的第一行是一个正整数k(1<=k<=1000),k是m的不同的素因子个数。 以下k行,每行两个整数,pi, ei,表示m的第i个素因子和它的指数(i = 1, 2, …, k)。p1, p2, …, pk是不同的素数。所有素因子按照从小到大排列,即p1 < p2<… < pk。输入文件中,2<=pi<10,000, 1<=ei<=1,000,000。

    Output
    输出文件包括三行。 第一行是机器人m号和它的老师中,所有政客的独立数之和除以10000的余数。 第二行是机器人m号和它的老师中,所有军人的独立数之和除以10000的余数。 第三行是机器人m号和它的老师中,所有学者的独立数之和除以10000的余数。

    Sample Input
    3
    2 1
    3 2
    5 1

    Sample Output
    8
    6
    75

    Data Constraint

    Hint
    样例解释: m=2*3^2*5=90。90号机器人有10个老师,加上它自己共11个。其中政客只有15号;军人有3号和5号;学者有8个,它们的编号分别是:2,6,9,10,18,30,45,90。
    .
    .
    .
    .
    .
    .

    分析

    欧拉函数+快速幂

    梳理一下题目意思:
    ①独立数是小于等于的m与互质的数(包括1)
    ②一个数的老师是这个数的因数(不包括1)
    ③政客:对于一个数x,如果x可以转换为偶数个不同的素因子的积,那它就是政客
    ④军人:对于一个数x,如果x可以转换为奇数个不同的素因子的积,那它就是军人
    ⑤学者:对于m的老师x,如果x既不是政客又不是军人,那它就是学者


    一个数的独立数其实就是它的欧拉函数和
    设f[i]为m的所有大于2的质因数中,选择i个质因数的欧拉函数和
    那么政客的独立数就是∑f[i]且(i%2==0)
    军人的独立数就是∑f[i]且(i%2==1)


    那么考虑学者的独立数和怎么求?
    这又要用到欧拉函数的一个性质:n=∑d|nϕ(d)
    m的所有的约数的欧拉函数之和为m
    也就是说学者的独立数和:m-军人-政客-1
    .
    .
    .
    .
    .

    程序:
    #include<iostream>
    using namespace std;
    int k,c[1001][2],f[1001],ans2=0,ans3=0,ans1=1,g,mod=10000;
    int work(int x,int y)
    {
        int ans1=1;
        while (y)
        {
            if (y%2) ans1=(ans1*x)%mod;
            y/=2;
            x=(x*x)%mod;
        }
        return ans1;
    }
    int main()
    {
        cin>>k;
        for (int i=1;i<=k;i++) 
        cin>>c[i][0]>>c[i][1];
        if (c[1][0]==2) g=2; else g=1;
    
        f[0]=1;
        for (int i=g;i<=k;i++)
        for (int j=i-g+1;j>=1;j--)
        f[j]=(f[j]+f[j-1]*(c[i][0]-1))%mod;
    
        for (int i=1;i<=k-g+1;i++)
        if (i%2) ans2=(ans2+f[i])%mod; else ans3=(ans3+f[i])%mod;
    
        for (int i=1;i<=k;i++) 
        ans1=(ans1*work(c[i][0],c[i][1]))%mod;
    
        ans1=(ans1+10000000-ans2-ans3-1)%mod;
        cout<<ans3<<endl;
        cout<<ans2<<endl;
        cout<<ans1<<endl;
        return 0;
    }
  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499933.html
Copyright © 2011-2022 走看看