zoukankan      html  css  js  c++  java
  • [欧拉函数][dp][快速幂] Jzoj P1161 机器人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

    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

    代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 using namespace std;
     6 const int mod=10000;
     7 int k,c[1010][2],f[1010],ans1=0,ans2=0,ans=1,g;
     8 int mi(int a,int b)
     9 {
    10     int ans=1;
    11     while (b)
    12     {
    13         if (b%2) ans=(ans*a)%mod;
    14         b/=2;
    15         a=(a*a)%mod;
    16     }
    17     return ans;
    18 }
    19 int main()
    20 {
    21     scanf("%d",&k);
    22     for (int i=1;i<=k;i++) scanf("%d%d",&c[i][0],&c[i][1]);
    23     if (c[1][0]==2) g=2; else g=1;
    24     f[0]=1;
    25     for (int i=g;i<=k;i++)
    26         for (int j=i-g+1;j>=1;j--)
    27             f[j]=(f[j]+f[j-1]*(c[i][0]-1))%mod;
    28     for (int i=1;i<=k-g+1;i++)
    29         if (i%2) ans1=(ans1+f[i])%mod; else ans2=(ans2+f[i])%mod;
    30     for (int i=1;i<=k;i++) ans=(ans*mi(c[i][0],c[i][1]))%mod;
    31     ans=(ans+10000000-ans1-ans2-1)%mod;
    32     printf("%d
    %d
    %d
    ",ans2,ans1,ans);
    33     return 0;
    34 }
  • 相关阅读:
    JS通过组装key值访问json对象中的值
    js属性对象的hasOwnProperty方法
    ES6 去掉已经 new Date().format 方法
    Ajax不能接受php return值的原因
    CentOS最常用命令及快捷键整理
    js中for循环中需要调用异步方法,怎么确保执行的顺序?
    MYSQL 更新字段,向字段追加字符串
    java-学习2
    java-学习1
    JS----贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/Comfortable/p/9284332.html
Copyright © 2011-2022 走看看