1006(6038)

就是对a,b分别求循环节,先统计一下b中所有长度循环节的出现次数,再对a求循环节时只要满足: a的循环节长度 % b的循环节长度=0,那么这个b的循环节就可以计入答案,尼玛只要是倍数就可以阿,比赛的时候死命想以为只有长度相同或者b的长度为1才能计算贡献,简直弱智。加了一个for就对了

/** @Date    : 2017-07-25 13:22:13
* @FileName: 1006.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL __int64
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;
const LL mod = 1e9 + 7;
LL a[N];
LL b[N];
bool visa[N];
bool visb[N];
LL cnta[N];
LL cntb[N];
int main()
{
LL n, m;
LL acnt;
int icase = 0;
while(~scanf("%I64d%I64d", &n, &m))
{
MMF(visa);
MMF(visb);
MMF(cnta);
MMF(cntb);
for(int i = 0; i < n; i++)
scanf("%I64d", a + i);
for(int j = 0; j < m; j++)
scanf("%I64d", b + j); for(int i = 0; i < m; i++)
{
if(!visb[i])
{
visb[i] = 1;
LL np = b[i];
LL c = 1;
while(!visb[np])
{
visb[np] = 1;
np = b[np];
++c;
}
cntb[c]++;
}
} LL ans = 1;
for(int i = 0; i < n; i++)
{
if(!visa[i])
{
visa[i] = 1;
LL np = a[i];
LL c = 1;
while(!visa[np])
{
visa[np] = 1;
np = a[np];
++c;
}
cnta[c]++;
////
LL tmp = 0;
for(int j = 1; j <= m; j++)
{
if(c % j == 0)
if(cntb[j])
tmp = (tmp + (j * cntb[j]) % mod) % mod;
}
//if(cntb[1] && c != 1)
// tmp = (tmp + cntb[1]) % mod;
//cout << c << " ~"<< c*cntb[c] <<"~" << cntb[1]<< endl;
ans = (ans * tmp + mod) % mod;
}
}
while(ans < 0)
ans+=mod;
printf("Case #%d: %I64d\n", ++icase, (ans + mod) % mod);
}
return 0;
}

1012(6044)

给出n个区间$l_i$,$r_i$,要求每个$\min{(l_i,r_i)} = p_i$,问能够构成合法情况,且其中的$p_i$大小关系不同的方案有几种。首先我们考虑一个区间$[l_i, r_i]$,如果它的左边界$l_i<i$,那么显然意味着$p_i$左边$i-l_i$个数与右边$r_{i}-i$个数的相对大小是不确定的(因为被$p_i$截断,后续区间的左边界必定不会小于i),而且其后的区间可以不再考虑左边的这些数。那么,我们dfs区间,每次把区间分为两部分$(L, i - 1)$,$(i+1, R)$,其中,一个区间的贡献的情况为$C_{r_{i}-l_{i}}^{i - l_{i}}$,注意判断当前区间是否合法(存在)。这题题目提示还要读入优化的外挂...我不会只能网上找个模板了..

/** @Date    : 2017-07-25 16:24:31
* @FileName: 1012 读入优化 组合.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e6+20;
const double eps = 1e-8;
const LL mod = 1e9 + 7; LL inv[N];
LL fac[N]; void init()
{
fac[0] = fac[1] = 1;
inv[0] = inv[1] = 1;
for(int i = 2; i < N; i++)
{
fac[i] = fac[i - 1] * i % mod;
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
for(int i = 1; i < N; i++)
(inv[i] *= inv[i - 1]) %= mod;
} LL C(LL n, LL k)
{
LL ans = 0;
if(k > n)
return 0;
ans = fac[n] * inv[k] % mod * inv[n - k] % mod;
return ans;
} struct yuu
{
LL l, r;
yuu(){}
yuu(LL _l, LL _r):l(_l),r(_r){}
bool operator <(const yuu &b) const
{
if(l != b.l)
return l < b.l;
return r < b.r;
}
}a[N]; map<yuu, LL>q; LL dfs(LL l, LL r)
{
LL ans = 1;
if(l > r)
return 1;
yuu tmp;
tmp.l = l, tmp.r = r;
LL p = q[tmp];
if(p == 0)
return 0;
else if(l == r)
return 1;
ans = ans * C(r - l, p - l) % mod;
LL x = dfs(l, p - 1) % mod;
LL y = dfs(p + 1, r) % mod;
if(!x || !y)
return 0;
ans = (ans * x % mod * y % mod + mod) % mod;
return ans;
}
/////
inline char nc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int fre(LL &x){
char ch=nc();
if(ch == EOF)
return -1;
x = 0;
while(!(ch>='0'&&ch<='9')) ch=nc();
while(ch>='0'&&ch<='9') x = x*10 + ch - 48, ch = nc();
return 1;
}
/////
int main()
{
init();
int icase = 0;
LL n;
while(/*~scanf("%lld", &n)*/~fre(n))
{
for(int i = 0; i < n; i++)
/*scanf("%lld", &a[i].l);*/ fre(a[i].l);
for(int i = 0; i < n; i++)
/*scanf("%lld", &a[i].r);*/ fre(a[i].r);
q.clear();
for(int i = 0; i < n; i++)
{
q[a[i]] = i + 1;
}
LL ans = dfs(1, n);
printf("Case #%d: %lld\n", ++icase, ans);
}
return 0;
}

2017 Multi-University Training Contest - Team 1的更多相关文章

  1. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】

    Dying Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】

    CSGO Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  6. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  8. 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】

    KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  10. 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】

    Add More Zero Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. Linux 安装php扩展 swoole

    swoole是一个PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncT ...

  2. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  3. PHP初级

    通过form  get post表单提交的数据,数据内容由用户填写或选择而得到!

  4. 【BioCode】删除未算出PSSM与SS的蛋白质序列

    代码说明: 由于一些原因(氨基酸序列过长),没有算出PSSM与SS,按照整理出来的未算出特征的文件,删除原来的蛋白质序列: 需删除的氨基酸文件732.txt(共732条氨基酸): 删除前 氨基酸共25 ...

  5. 结对编程——paperOne基于java web的简易四则运算出题网站

    项目成员:张金生     张政 需求分析: 1.要进行四则运算: 2.运算题目随机: 3.进行对错判断: 4.整数运算. 程序概要: 1.用JSP实现: 2.用户可选择题目数量: 3.答题页用表格列出 ...

  6. 【php】header下载文件后,文件变大的问题;(ob_clean()清空缓存)

    事由: 按照常理,为了下载一个生产的文件,都是使用header函数,指定下文件信息,然后开始下载,但是下载后发现,文件体积总是比源文件要大2个字节,源文件是24字节,下载后是26字节,查看服务器返回的 ...

  7. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  8. P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  9. linux系统常见命令以及操作

    2.安装xshell,安装完打开,配置回话,输入名称(随便).SSH.主机(打开linux,点击右上角电脑图标system etho进行联网,打开终端输入ifconfig回车,找到inet add地址 ...

  10. 【BZOJ1143】祭祀(网络流)

    [BZOJ1143]祭祀(网络流) 题面 BZOJ 洛谷 Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大 ...