链接  http://acm.hdu.edu.cn/showproblem.php?pid=6038

题意: 
给你一个a序列,代表0到n-1的排列;一个b序列代表0到m-1的排列。问你可以找出多少种函数关系f,f的定义域内的i都满足f(i)=b[f(a[i])]; 
分析:这个主要是找循环节 循环节导致函数有多种情况 找到每段循环节的 取值 种数 相乘起来就是答案
比如说:如果 a 序列是 2 0 1 那么我们可以发现

f[0] = b[f(a[0])]     f[0]  = b[f(2)] 
f[1] = b[f(a[1])]     f[1]  = b[f(0)] 
f[2] = b[f(a[2])]     f[2]  = b[f(1)]

对于这组数来说,假如我们先指定了f(0)对应的在b中的值,那么根据第2个式子,就可以得出f(1),根据f(1)就又可以得出f(2),最后根据f(2)就可以检验f(0)的值是否正确。

仔细观察左边的柿子 (定义域)i与a[ i ] 是循环的 如果想使上述成立,必须右边的柿子(值域)i与b[ i ] 也存在其约数长度的循环节。

如果不是约数长度的循环节会使上述假设矛盾    自己写一下就知道了 只有被整出才会成立。

每个定义域的循环节都可以与每个值域的循环节匹配(满足红字匹配成功)

那么就是找两个序列的不相交的循环节,对于定义域里面的每一个循环节都找出来有多少种情况。每一个循环节的情况数为它所能匹配的值域循环节的长度 和。每个循环节的情况数乘起来就是答案了

样例一  (1+1)*(1+1)=4; a两个环(长度 2 1)           b两个个环(长度 1 1)       2与1 1匹配   1与1 1 匹配

样例二  (1+3)=4;           a一个环(长度 3)                b两个环(长度 1 3)         3与1 3匹配

注   对于一个a循环节  若b循环节中没有能与之匹配的   答案为零   想想为什么  不用特判累积过程中可以处理掉

AC代码

 #include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
using namespace std;
const int maxn= 1e5+;
const int mod= 1e9+;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int n,m;
int a[maxn],b[maxn];
int vis[maxn],loop_a[maxn],loop_b[maxn]; //loop存循环节长度
int main()
{
int kase=;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=; i<n; i++)
scanf("%d",&a[i]);
for(int i=; i<m; i++)
scanf("%d",&b[i]);
memset(vis, , sizeof(vis));      //标记是否访问过 找不相交的循环节
memset(loop_b, , sizeof(loop_b));
memset(loop_a, , sizeof(loop_a));
int cnt1=,cnt2=; //cnt记录循环节个数
for(int i = ; i < n; i++)
{
if(!vis[i]) //过程自己模拟一下就明了了
{
int x = a[i];
int len = ;
while(!vis[x])
{
len++;
vis[x] = ;
x = a[x];
}
if(len!=)
loop_a[cnt1++]=len; //保存循环节
}
}
memset(vis, , sizeof vis);
for(int i = ; i < m; i++) //b同理
{
if(!vis[i])
{
int x = b[i];
int len = ;
while(!vis[x])
{
len++;
vis[x] = ;
x = b[x];
}
if(len!=)
loop_b[cnt2++]=len;
}
}
ll ans=;
for(int i=; i<cnt1; i++) //枚举a与b的循环节 试了不会超时 还有更快一些的做法
{
ll sum=;                //记录每个循环节的情况数
for(int j=; j<cnt2; j++)
{
if(loop_a[i]%loop_b[j]==)    //只有是约数才能匹配
{
sum=(sum+loop_b[j])%mod; //加进去 取模
}
}
ans=(ans*sum)%mod; //乘到答案里面
}
printf("Case #%d: %lld\n",++kase,ans);
}
return ;
}

作者水平有限 欢迎大佬纠错!

多校真jb难啊~~~~~QAQ

太菜了

2017多校第一套&&hdu6038 思维 数学的更多相关文章

  1. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  2. HDU-6035 Colorful Tree(树形DP) 2017多校第一场

    题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...

  3. hdu 6044 : Limited Permutation (2017 多校第一场 1012) 【输入挂 组合数学】

    题目链接 参考博客: http://blog.csdn.net/jinglinxiao/article/details/76165353 http://blog.csdn.net/qq_3175920 ...

  4. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】

    题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...

  5. 2017 多校5 hdu 6093 Rikka with Number

    2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...

  6. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  7. hdu6038[找规律+循环节] 2017多校1

    /*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...

  8. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  9. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

随机推荐

  1. 开源一个上架 App Store 的相机 App

    Osho 相机是我独立开发上架的一个相机 App,App Store地址:https://itunes.apple.com/cn/app/osho/id1203312279?mt=8.它支持1:1,4 ...

  2. java随机生成验证码

    package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...

  3. 大白话Vue源码系列(05):运行时鸟瞰图

    阅读目录 Vue 实例的生命周期 实例创建 响应的数据绑定 挂载到 DOM 节点 结论 研究 runtime 一边 Vue 一边源码 初看 Vue 是 Vue 源码是源码 再看 Vue 不是 Vue ...

  4. 7、树莓派编程;gpio编程;led闪烁

    本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ12226981 1.树莓派接口对照,一定要找到对应的引脚,不要接错了.我画上箭头. 2.安装 下载地址,https://git.drogon.n ...

  5. JQuery和JS操作LocalStorage/SessionStorage的方法

    LocalStorage 是对Cookie的优化 没有时间限制的数据存储 在隐私模式下不可读取 大小限制在500万字符左右,各个浏览器不一致 在所有同源窗口中都是共享的 本质是在读写文件,数据多的话会 ...

  6. Linux的编码及编码转换

    如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Li ...

  7. JavaScript Array 对象方法 以及 如何区分javascript中的toString()、toLocaleString()、valueOf()方法

    1.concat() 2.join() 3.pop() 4.push() 5.reverse() 6.shift() 7.unshift() 8.slice() 9.sort() 10.splice( ...

  8. python 模块:xlrd && xlwt

    主要来自:http://www.jb51.net/article/60510.htm python读excel--xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本 ...

  9. 项目实战10.1—企业级自动化运维工具应用实战-ansible

    实战环境: 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测 ...

  10. AFNetWorking 对汉字部分UTF-8编码

    随笔记一下 好用的小技巧 1.将字典数据拼接成url的参数... AFQueryStringFromParameters NSString *query = AFQueryStringFromPara ...