2017多校第一套&&hdu6038 思维 数学
链接 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 思维 数学的更多相关文章
- HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场
题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...
- HDU-6035 Colorful Tree(树形DP) 2017多校第一场
题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...
- hdu 6044 : Limited Permutation (2017 多校第一场 1012) 【输入挂 组合数学】
题目链接 参考博客: http://blog.csdn.net/jinglinxiao/article/details/76165353 http://blog.csdn.net/qq_3175920 ...
- hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】
题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...
- 2017 多校5 hdu 6093 Rikka with Number
2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- hdu6035[dfs+思维] 2017多校1
/*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
随机推荐
- echarts中如何使用timeline组件
1.吃碗面 这里关于echarts3 官网的示例我不得不吐槽一下,逼格真高!一小部分示例动不动数据就是国家统计局搞出来的,你脸真大.当然他们做的示例的确是很好,这一点毫无疑问.当我看了echarts3 ...
- “乐”动人心--2017年10款最佳音乐类APP设计盘点
在上下班的路上,听几首自己喜欢的音乐来打发无聊的等公交车和地铁的时间是现代年轻人的常态.音乐作为最能鼓动人心的"语言",也成为了人们在互联网生活里占比例最高的消费活动之一,一款好看 ...
- OpenGL ES学习001---绘制三角形
PS:OpenGL ES是什么? OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计 ...
- oracle里的优化器
1.1 oracle里的优化器 RBO(Rule-Based-Optinizer):基于规则的优化器 CBO(Cost-Based-Optinizer): 基于成本的优化器 SQL语句执行过程 待执行 ...
- kafka 消费
前置资料 kafka kafka消费中的问题及解决方法: 情况1: 问题:脚本读取kafka 数据,写入到数据库,有时候出现MySQL server has gone away,导致脚本死掉.再次启 ...
- css 背景色渐变兼容写法
最近在项目中,有很多地方都用到了线性渐变,比如:表单提交按钮的背景,数据展示的标题背景等等,按照以前的做法是切 1px 图片然后 repeat-x.下面我将介绍如何用 css 来完成该效果. css3 ...
- 一、JavaSE语言概述
1.软件:系统软件 VS 应用软件 2.人与计算交互:使用计算机语言.图形化界面VS命令行. 3.语言的分类:第一代:机器语言 第二代:汇编语言 第三代语言:高级语言(面向过程-面向对象) 4.jav ...
- Nginx服务器配置之location语法分析
location基本语法:location [=|~|~*|^~] /uri/ { - } = 严格匹配.如果这个查询匹配,那么将停止搜索并立即处理此请求. ~ 为区分大小写匹配(可用正则表达式) ! ...
- [Spark内核] 第34课:Stage划分和Task最佳位置算法源码彻底解密
本課主題 Job Stage 划分算法解密 Task 最佳位置算法實現解密 引言 作业调度的划分算法以及 Task 的最佳位置的算法,因为 Stage 的划分是DAGScheduler 工作的核心,这 ...
- LindDotNetCore~Mock对实际应用中的意义
回到目录 Mock在单元测试里的意义 Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以 便测试的测试方法.一个闹钟根据时间来进行提醒服务,如果过了下午5点 ...