题意

有 \(N\) 种不同的怪兽,标号为 \(1\) 到 \(N\)
每天晚上,所有的怪兽都会死去,当一只怪兽死去的时候,它会生出一只或者多只怪兽,因此怪兽的数量从来不会减少
给你一个字符数组表示每种怪兽死去的时候能生出哪些种类的怪兽
假设第 \(i\) 个字符串为"2 3 3",表示第i只怪兽死的时候,1只2类型的怪兽和2只3类型的怪兽会生出来
显然,怪兽的数量可能会是无穷大的,也有些时候会变成一个定值
一开始你只有一只1类型的怪兽,你想要知道最终会有多少只怪兽,对 \(1e9+7\) 取模
如果有无穷多只,输出 \(-1\)

输入格式

第一行输入一个整数 \(n\) 表示怪兽的种类数 \((1≤n≤50)\)
接下来 \(n\) 行每行一个字符串由若干个数字构成
意义见题面描述

输出格式

输出一个整数

样例输入&输出

样例1

1
11

样例2

1
1 1-1

样例3

3
2
3
11

样例4

4
1
2 4
2
21

样例5

7
2 2
3
4 4 4
5
6
7 7 7 7
724

样例6

7
2 3
5 7
2 4
5
6
4
75

样例7

7
2
3
6 4
3 5
2
7
2-1

样例8

5
2
3 4
5
5
2-1

分析

本题输入很坑,用getchar或者stringstream+string+getline
别忘开long long
构造一张图 \(G\) ,若怪物 \(i\) 能繁殖出一只怪物 \(j\) ,则连边 \(<i,j>\) (有向边)

1. dfs判环,dfs计算答案 \(\text{Time Limit Exceeded}\)

若存在一个在环上的点,它的出度大于1,那么肯定会无限循环。
用邻接矩阵存图,因为可能存在很多重边。

#include<cstdio>
#include<cstdlib>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#define maxn 52
#define maxm 2502
#define mod 1000000007
using namespace std;
char ch;
int read(int& x){x=0;while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}while(ch==' ')ch=getchar();if(ch==EOF){return 0;}if(ch=='\n'){ch=getchar();return 0;}return 1;
}
int n,g[maxn][maxn],st[maxn],top;
bool oncyc[maxn],inst[maxn];
void getcyc(int u){st[++top]=u;inst[u]=1;int count=0;for(int v=1;v<=n;v++){if(!g[u][v])continue;count+=g[u][v];if(!inst[v]){getcyc(v);}else{int t;for(t=top;st[t]!=v;t--);for(int i=t;i<=top;i++){oncyc[st[i]]=1;}}if(oncyc[u]&&count>1){printf("-1\n");exit(0);}}top--;inst[u]=0;
}
long long DFS(int u){long long ret=0;for(int v=1;v<=n;v++){if(!g[u][v])continue;if(oncyc[v]){ret=(ret+g[u][v])%mod;continue;}ret=(ret+DFS(v)*g[u][v]%mod)%mod;}return ret;
}
int main(){while(ch<'0'||ch>'9')ch=getchar();read(n);for(int u=1;u<=n;u++){int v;bool tmp;while(1){tmp=read(v);g[u][v]++;if(!tmp)break;}}getcyc(1);printf("%lld\n",DFS(1));return 0;
}

2. 矩阵快速幂

我们定义矩阵\[S=[1,0,0,...,0]\]
\(S\) 长为 \(1\) ,宽为 \(n\)
再定义矩阵 \(A\) 为 \(G\) 的邻接矩阵
我们发现,怪兽每繁殖一次,相当于做一次 \(S=S* A\) 的运算
我们用矩阵快速幂,让 \(S\) 分别乘 \(1e8\) 和 \(2e8\) 次得到矩阵 \(R\) 和 \(T\) ,由于结果很大,所以要取模,多取几个模数,比较 \(R\) 和 \(T\) 中元素之和是否相等。由于最后输出的答案需要取模 \(1e9+7\) ,所以把 \(1e9+7\) 放在最后取模。

Code

#include<cstdio>
#pragma GCC optimize(2)
#define maxn 52
using namespace std;
long long mod;
long long Plus(long long a,long long b){long long ret=a+b;return ret>=mod?ret-mod:ret;
}
long long mul(long long a,long long b){return a*b%mod;
}
struct matrix{long long a[maxn][maxn];int n,m;matrix& operator =(const matrix& M){n=M.n,m=M.m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=M.a[i][j];}}}void init(int _n,int _m){n=_n,m=_m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)a[i][j]=0;a[i][i]=1;}}void init0(int _n=0,int _m=0){n=_n,m=_m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=0;}}}void output()const{for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){printf("%lld ",a[i][j]);}putchar('\n');}}
};
const matrix mul(const matrix& a,const matrix& b){matrix ans;ans.init0(a.n,b.m);if(a.m!=b.n)return ans;for(int i=1;i<=a.n;i++){for(int j=1;j<=b.m;j++){ans.a[i][j]=0;for(int k=1;k<=a.m;k++){ans.a[i][j]=Plus(ans.a[i][j],mul(a.a[i][k],b.a[k][j]));}}}return ans;
}
matrix qpow(matrix a,long long b){matrix ans;ans.init(a.n,a.m);while(b){if(b&1)ans=mul(ans,a);a=mul(a,a);b>>=1;}return ans;
};
matrix s,t,g;
int n;
namespace INIT{char ch;int read(int& x){x=0;while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}while(ch==' ')ch=getchar();if(ch==EOF){return 0;}if(ch=='\n'){ch=getchar();return 0;}return 1;}void init(){while(ch<'0'||ch>'9')ch=getchar();read(n);g.n=g.m=n;for(int u=1;u<=n;u++){int v;bool tmp;while(1){tmp=read(v);g.a[u][v]++;if(!tmp)break;}}}
}
long long MOD[5]={0,19260817,1000000009,998244353,1000000007};
int main(){INIT::init();long long ans1,ans2;for(int j=1;j<=4;j++){mod=MOD[j];s.init(1,n);s=mul(s,qpow(g,100000000));t.init(1,n);t=mul(t,qpow(g,200000000));ans1=ans2=0;for(int i=1;i<=n;i++)ans1=Plus(ans1,s.a[1][i]),ans2=Plus(ans2,t.a[1][i]);if(ans1!=ans2){puts("-1");return 0;}}printf("%lld\n",ans1);return 0;
}

3. 强连通分量,缩点

Unknown

Code

转载于:https://www.cnblogs.com/BlogOfchc1234567890/p/9874634.html

XJOI 3879 怪兽繁殖相关推荐

  1. 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?...

    作者 | 伍杏玲 出品 | AI 科技大本营(ID:rgznai100) 头图 | 下载于ICphoto 2015 年,在英特尔就职 28 年的总裁 Renee James 辞职,正在大众纷纷猜测她将 ...

  2. 新版蚂蚁网有抄袭怪兽吗?

    昨天晚上看我在TECHWEB的博客,有人回复说蚂蚁新版有抄怪兽的嫌疑,我先是一愣,麦田会抄我们吗? Re:艰难的原创--谈互联网创业 你TMD傻啊,[url]http://beta.mayi.com[ ...

  3. 谷歌上线AI新玩法:随手乱涂鸦,一键变怪兽

    蕾师师 发自 凹非寺  量子位 报道 | 公众号 QbitAI 小明随意地涂鸦了一个头部,再简单地画了个翅膀,加上一个大尾巴--再单击「转换」键. 一只面目狰狞.皮肤粗糙.纹理细致的大怪兽就创造出来了 ...

  4. 街电与搜电网络营销外包合并,怪兽充电终上市共享充电市场将迎来新变化

    怪兽充电趁着愚人节的夜晚悄悄在纳斯达克挂牌上市,在第二天惊艳了所有人.此番怪兽充电首日开盘上市截至收盘市值约为21.29亿美元,然而尽管怪兽充电上市也不能掩盖前合伙人对怪兽充电告上法庭的事实.与此同时 ...

  5. 共享经济网络营销外包下的怪兽充电冲向纳斯达克“充电宝要上市”!

    日前,据有关消息称,内地共享充电器公司怪兽充电正式向美国证券交易委员会递交上市申请,拟定于纳斯达克交易所上市.很多用户对此表示好奇"充电宝都上市了?"究竟是怎样的网络营销外包让&q ...

  6. LintCode 1683. 杀怪兽(队列)

    1. 题目 有 n 只怪兽和一个奥特曼,奥特曼和怪兽都有5个属性值. 当且仅当奥特曼的5个属性值都不小于怪兽时,奥特曼可以杀死怪兽. 当一个怪兽被杀掉时,这个怪兽的5个属性会增加到奥特曼身上. 请问奥 ...

  7. 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?

    2015 年,在英特尔就职 28 年的总裁 Renee James 辞职,正在大众纷纷猜测她将如何开启下一段旅程时,她有了创业的想法,2017 年带领新团队创立了专注于为云和边缘打造微处理器的 Amp ...

  8. 奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容

    <奥特曼系列ol>这款游戏中的怪兽图鉴也是很多玩家非常关注的问题之一哦,随着游戏的不断的更新,游戏也是加入了不少全新的玩法,一定让很多玩家觉得有些迷惑吧.下面小编为大家带来<奥特曼系 ...

  9. 怪兽充电宝 共享充电宝源码

    介绍: 怪兽充电宝源码共享充电宝源码,怪兽充电是一款全新的智能共享充电宝产品,受到广大用户的喜爱,也便利了人们的生活. 网盘下载地址: http://kekewl.cc/rdeOykY31rs0 图片 ...

最新文章

  1. iOS开发拓展篇—CoreLocation简单介绍
  2. Android开发工具——ADB(Android Debug Bridge) 三DalvikVM之jdwp线程
  3. 终于有人把JAVA虚拟机讲清楚了!
  4. EXP1 PC平台逆向破解
  5. idea mybatis generator插件_Mybatis使用自定义插件去掉POJO的Getter和Setter方法
  6. C++代理 Surrogate
  7. html5支持多中浏览器写法,html5及css3对table表格高亮当前行列的多浏览器兼容写法...
  8. matlab中的种子数seed,set.seed()设置种子到底是啥作用?
  9. wps多人协作的意义_全民皆扁平?WPS时隔六年更新图标,W却变胖了…
  10. 点赞功能java_jquery点赞功能实现代码 点个赞吧!
  11. matlab中进行多行注释
  12. 神经网络中的logits是什么意思
  13. 2021年保育员(中级)考试及保育员(中级)免费试题
  14. win api 路径操作函数
  15. Lync 2010升级到Lync 2013 之设定企业联盟!
  16. python没有库怎么办_python缺少依赖(ImportError)库怎么办 | C/C++程序员之家
  17. IE不能下载MSG文件的解决方案
  18. 前端系列之实战(城市医院预约挂号平台2.基本样式编写)
  19. java怎么实现发布说说_仿QQ发表说说
  20. XSS测试平台搭建(超详细)

热门文章

  1. nvue引入字体图标
  2. nsis 检测vcredist_x86是否安装
  3. altera fpga关于时钟内部连接问题
  4. sql排序规则,笔画,汉字,拼音,....(转载)
  5. 分享购商业模式的4大机制,你知道几个?
  6. 产业洞察 | 阿里云宣称“全面上云的拐点到了”,预示着什么?
  7. 8.3 证明STINGY SAT是NP完全问题
  8. SQL语句on duplicate key update 的意思
  9. linux查看错误日志
  10. Tomcat简介以及在Eclipse中配置