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

    :
    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 的余数。

    一句话题意
    对于m的约数 i
    如果能够整除i 的 奇素数为偶数个 则为政客 计算(sum phi(i))
    如果能够整除i 的 奇素数为奇数个 则为军人 计算(sum phi(i))
    否则为学者


    对于约数i 我们可以用唯一分解定理 来枚举
    因为是不同的素数 所以分解唯一 所以我们定义 (F[i][1/0])表示前i个质因数中 军人/政客的 (phi)值的和
    (f[i][1]=f[i-1][1]+sum phi(政客k*zhi[i]))
    因为 (phi)为积性函数
    所以 (f[i][1]=f[i-1][1]+phi(zhi) sum phi(政客k))
    进而我们有 (f[i][1]=f[i-1][1]+phi(zhi[i])*f[i-1][0])

    军人和政客 同理

    至于学者

    我们发现 (sum_i phi(I)) ({I|m})
    打表可知 为 (m)
    容斥一下即可
    注意先%再+%再%

    code:

    #include<stdio.h>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define ll long long
    #define mod 10000
    #define maxnn 10000000
    ll n,k;
    ll m=1;
    ll a,b;
    ll su[maxnn];
    ll f[maxnn][3];
    ll tot=0;
    ll ksm(ll a ,ll b){
        ll ans=1;
        while(b)
        {
            if(b&1) ans=(ans*a)%mod;
            a=(a*a)%mod;
            b>>=1;
        }
        return ans%mod;
    }
    int main()
    {
        cin>>k;
        for(int i=1;i<=k;i++)
        {
            scanf("%lld%lld",&a,&b);
            m=m*ksm(a,b)%mod;
            if(a==2)continue;
            su[++tot]=a;
        }
        f[0][0]=1;
        for(int i=1;i<=tot;i++)
        {
            
            f[i][1]=(f[i-1][1]%mod+f[i-1][0]*(su[i]-1)%mod)%mod;
            f[i][0]=(f[i-1][0]%mod+f[i-1][1]*(su[i]-1)%mod)%mod;
        }
        f[tot][0]--;
        cout<<f[tot][0]%mod<<endl;
        cout<<f[tot][1]%mod<<endl;
        cout<<((m-f[tot][0]-f[tot][1]-1)%mod+mod)%mod<<endl;
    }
    
    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    判断ascii码是什么的函数
    php curl
    js form settimeout
    windows php文件下载地址
    面试(3)
    [读码时间] 显示单击的坐标
    [读码时间] 模拟select控件
    [读码时间] 星级评分
    [读码时间] 事件练习:封闭兼容性添加,删除事件的函数
    [读码时间] 数组方法的使用
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11496966.html
Copyright © 2011-2022 走看看