HDU 6038.Function-数学+思维 (2017 Multi-University Training Contest - Team 1 1006)
学长讲座讲过的,代码也讲过了,然而,当时上课没来听,听代码的时候也一脸o((⊙﹏⊙))o
我的妈呀,语文不好是硬伤,看题意看了好久好久好久(死一死)。。。
数学+思维题,代码懂了,也能写出来,但是还是有一点不懂,明天继续。
感谢我的队友不嫌弃我是他的猪队友(可能他心里已经骂了无数次我是猪队友了_(:з」∠)_ )
Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2021 Accepted Submission(s): 956
Define that the domain of function f is the set of integers from 0 to n−1, and the range of it is the set of integers from 0 to m−1.
Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n−1.
Two functions are different if and only if there exists at least one integer from 0 to n−1 mapped into different integers in these two functions.
The answer may be too large, so please output it in modulo 109+7.
For each case:
The first line contains two numbers n, m. (1≤n≤100000,1≤m≤100000)
The second line contains n numbers, ranged from 0 to n−1, the i-th number of which represents ai−1.
The third line contains m numbers, ranged from 0 to m−1, the i-th number of which represents bi−1.
It is guaranteed that ∑n≤106, ∑m≤106.
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<bitset>
#include<set>
#include<map>
#include<time.h>
using namespace std;
typedef long long ll;
const int maxn=+;
const int mod=1e9+;
map<int,int>mp1,mp2;
map<int,int>::iterator it1,it2;
int a[maxn],b[maxn],vis[maxn];
int n,m;
void solve(int n,int *f,map<int,int> &mp)
{
memset(vis,,sizeof(vis));
int j,k;
for(int i=;i<n;i++)
{
j=i,k=;
while(!vis[j])
{
k++;
vis[j]=;
j=f[j];
}
if(k)
mp[k]++;
}
}
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]);
mp1.clear();
mp2.clear();
solve(n,a,mp1);
solve(m,b,mp2);
ll ans=;
for(it1=mp1.begin();it1!=mp1.end();it1++)
{
ll cnt=,x=it1->first,t=it1->second;
for(it2=mp2.begin();it2!=mp2.end();it2++)
{
int y=it2->first,num=it2->second;
if(x%y==)cnt=(cnt+y*num)%mod;
}
for(int i=;i<=t;i++)
ans=(ans*cnt)%mod;
}
printf("Case #%d: %lld\n",++kase,ans);
}
return ;
}
学长的代码比我队友的快_(:з」∠)_
溜了溜了。不想喝拿铁咖啡。
加油加油_(:з」∠)_
最新文章
- [虾扯蛋] android界面框架-Window
- 详解 IOS 7.1 程序启动原理
- 用Backbone.js创建一个联系人管理系统(三)
- jquery扩展函数详解(我的人生颠覆)
- .NET 通过SmtpClient发送邮件 提示 4.7.1 service unavailable try again later 解决办法
- [Bootstrap] 2. class &#39;row&#39; &; &#39;col-md-x&#39; &; &#39;col-md-offset-x&#39;
- JAVA GUI学习 - 窗体背景图片设置方法:重写paintComponent(Graphics g)方法
- SQL 默认数据库被误删
- Spring.net 学习IOC------属性注入
- hibernate的一级和二级缓存
- Visual Studio 2010多线程编程
- dubbo could not get local host ip address will use 127.0.0.1 instead 异常处理
- How to enable AHCI on Windows7
- zabbix在ubuntu16.04上的安装
- Fiddler抓包6-get请求(url详解)
- 扫盲记-第六篇--Normalization
- 重写&;重载
- Docker:集装箱式“运输”在软件上的实现
- H5音乐播放器源码共享
- ASP.NET MVC3控制器传递匿名对象到视图实例
热门文章
- erlang连接mysql [转]
- 软引用SoftReference
- Unicode字符图标
- 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(上)
- USACO Section1.5 Prime Palindromes 解题报告
- Python列表深浅复制详解
- 六 APPIUM Android 定位方式
- web浏览器中的javascript -- 2
- Thread suspend()挂起resume()恢复
- 有许多部分没有在cgroup中显示啊,current/high/low/min等等