3336 机器人 M 号(动态规划NOI)

文章描述了一个未来场景,Macsy在火星部署的机器人系列中,每个机器人具有独特的生成规则和工作模式。机器人通过记忆传递和独立数计算问题,涉及到素数分解和编程算法。任务是帮助机器人计算不同职业机器人的独立数之和,以特定模数输出结果。
摘要由CSDN通过智能技术生成

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

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}
template <typename T>
inline void write(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10^48);
    return ;
}
const int N=1e6+5,M=1e6+5,MOD=10000;
#define ll long long
int n,p,c,dp[N][2];
inline int QuickPow(int x,int y){
int res=1;
while(y){
if(y&1) res=res*x%MOD;
x=x*x%MOD;
y>>=1;
}
return res;
}
int main(){
read(n);int tmp=1;
dp[0][0]=1;
for(int i=1;i<=n;i++){
read(p),read(c);
tmp=tmp*QuickPow(p,c)%MOD;
dp[i][0]=(dp[i-1][1]*(p==2?0:p-1)+dp[i-1][0])%MOD;
dp[i][1]=(dp[i-1][0]*(p==2?0:p-1)+dp[i-1][1])%MOD;
}
dp[n][0]=(dp[n][0]-1+MOD)%MOD;
write(dp[n][0]),putchar('\n'),write(dp[n][1]),putchar('\n'),write(((tmp-dp[n][0]-dp[n][1]-1)%MOD+MOD)%MOD);
return 0;
}

/**
* @runId: 781902
* @language: C++
* @author: 13840002072
* @submitTime: 2023-09-03 13:54:15
*/

/**
* @runId: 1013057
* @language: C++
* @author: 13840002072
* @submitTime: 2023-10-15 15:12:11
*/

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值