hdu3461(并查集+快速幂)
来源:互联网 发布:js仿今日头条导航栏 编辑:程序博客网 时间:2024/05/17 21:41
链接:点击打开链接
题意:有一个n位,由26个字母组成的的密码锁,有m个区间[l,r],每次可以将[l,r]区间内的字母一起向前或向后移动(也就是a变成b,或者a变成z),可以相互转换的密码算作一种,问有几种密码
代码:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const long long MOD=1000000007;int par[10000005];void init(int n){ int i; for(i=0;i<=n;i++) par[i]=i;}int found(int x){ if(par[x]==x) return par[x]; return par[x]=found(par[x]);}void unite(int x,int y){ x=found(x); y=found(y); if(x==y) return; par[x]=y;}bool same(int x,int y){ return found(x)==found(y);}long long quickmod(long long a,long long b){ long long sum=1; while(b){ if(b&1) sum=sum*a%MOD; b>>=1; a=a*a%MOD; } return sum;}int main(){ //因为每多一个独立的区间就有26种状态 int i,n,m,l,r,sum; //重复,因此假设独立的区间数是sum,则 while(scanf("%d%d",&n,&m)!=EOF){ //每一次重复的状态数是26^sum,又因为总 sum=0; //状态数是26^n,所以总的种数就是26^(n-sum) init(n+1); for(i=1;i<=m;i++){ scanf("%d%d",&l,&r); if(!same(l,r+1)){ //l与r+1合并的原因是 sum++; //[1,2],[3,4],[1,4]算作两个区间 unite(l,r+1); //而[1,2],[2,4],[1,4]则不是两个区间 } } printf("%I64d\n",quickmod(26,n-sum)); } return 0;}
0 0
- hdu3461(并查集+快速幂)
- hdu3461 Code Lock(并查集+快速幂)
- hdu3461 Code Lock (并查集+快速幂)
- HDU3461(并查集)
- hdu3461之并查集
- HDU3461 Code Lock 并查集应用
- 09-07 HDU_Steps5.1 并查集 HDU1829 HDU1325 HDU1598 HDU3461 HDU3635 HDU2473 HDU3172 HDU3038
- poj 快速幂+并查集
- hdu3461Code Lock 快速幂+并查集
- hdu3461Code Lock【并查集+快速幂】
- 可供快速查:并查集
- hdu3461
- hdu3461
- hdu 3461 Code Lock【并查集+快速幂】
- hdu 3461 Code Lock(并查集+快速幂)
- hdu 3461 Code Lock(并查集+快速幂)
- Code Lock(并查集 + 快速幂)
- 快速并查集(Java实现)
- MongoDB(一)简介和安装使用
- Linux基础命令
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
- Android入门--CheckBox 的isChecked 属性
- linux下面select返回115错误
- hdu3461(并查集+快速幂)
- POJ2409 Let it Bead
- hdu 2082 找单词 母函数
- 依赖注入——人生若只如初见
- hdu 5407 CRB and Candies(数论,LCM,快速幂取模,求逆元)
- Redis基础(1)
- JavaScript 入门篇
- STM7F系列的资料
- 关于容器~