F - Function
2024-08-27 08:46:52
先找到数组A中的循环节,再找到数组B中的循环节,如果B中的循环节是A中循环节的循环因子,说明可以配对,结果累积起来。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
const int MOD=1e9+7;
#define LL long long
LL a[MAXN],b[MAXN];
LL num1[MAXN],num2[MAXN];
int main()
{
LL n,m;
LL ca=1;
while(scanf("%lld%lld",&n,&m)==2)
{
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
for(int i=0;i<m;i++)scanf("%lld",&b[i]);
//首先求a的循环节
//i===f(a[i])
//num[i]表示都i个循环节的长度
LL tot=0;
for(int i=0;i<n;i++)
{
if(a[i]==-1)continue;
tot++;
LL ii=i;
while(a[ii]!=-1)
{
num1[tot]++;
LL t=ii;
ii=a[ii];
a[t]=-1;
}
}
//求b的循环节,num2[i]表示长度为i的循环节的数量
for(int i=0;i<m;i++)
{
if(b[i]==-1)continue;
LL len=0;
LL ii=i;
while(b[ii]!=-1)
{
len++;
LL t=ii;
ii=b[ii];
b[t]=-1;
}
num2[len]++;
}
//开始匹配,如果长度相同则匹配成功,累积
LL sum=1;
for(int i=1;i<=tot;i++)
{
LL cnt =0;
//cout<<num1[i]<<endl;
for(int j=1;j<=num1[i];j++)
{
if(num1[i]%j==0)
{
cnt=(cnt+num2[j]*j)%MOD;
//cout<<cnt<<num1[i]<<endl;
}
}
sum=(sum*cnt)%MOD;
}
printf("Case #%lld: %lld\n",ca++,sum%MOD);
}
return 0;
}
最新文章
- Windows系统上的.Net版本和.NETFramework的C#版本
- 关于当传过来的值转换成string类型报错的问题
- debug [LTS]
- Maven教程
- MacOS长按无效问题
- 测试CAS
- linux下系统对于sigsegv错误时的处理
- Android的init过程(二):初始化语言(init.rc)解析【转】
- JS----构造函数与原型prototype 区别
- Android中sharedPreference的简单使用
- Dev系列控件的AJAX (转)
- hdu4370 0 or 1【最短路+建图】
- 使用Dockerfile制作自己的Docker镜像
- ASP.NET Core 依赖注入(DI)简介
- C# GDI+双缓冲技术
- 多线程Java Socket编程
- Spark SQL讲解
- Flask 视图,模板,蓝图.
- lapis 集成openresty最新版本cjson 问题的解决
- 基于spring和mybatis的简单项目流程
热门文章
- json解析bug之ERROR ExceptionController:185 - not close json text, token : :
- CentOS 7下安装Logstash ELK Stack 日志管理系统(下)
- SharePoint 2013 调查问卷的使用方法
- js将月份转换为英文简写的形式
- windows下Python扩展问题error: Unable to find vcvarsall.bat
- Chapter1-data access reloaded:Entity Framework(上)
- 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证
- ubuntu字符界面下显示中文和调整分辨率
- (转载)synchronized代码块
- POJ1458 Common Subsequence —— DP 最长公共子序列(LCS)