6038 Function 数学(循环节)

题意:给出两个排列a[i]:0~n-1和b[i]:0~m-1.问有多少种F,满足F[i]=b[F[a[i]] ? n,m<=1e5.
i: 0 1 2
a[i]:1 0 2 f[0]=b[f[1]] f[1]=b[f[0]],f[2]=b[f[2]]
如果知道循环节上任意一个的f值 则循环节上剩下的f值也就确定了.

假如f[i]所在循环节长度为L,f[i]等于某个b[x].
因为:f[i]=b[f[a[i]]] =b[ b[ f[a[a[i]]] ] ]. 则b[x]经过L次变化又回到原来,则b[x]的循环节必须为L的因子.
找出a,b循环节 利用上面条件即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
const ll mod=1e9+7;
int a[N],b[N],n,m,vis[N];
vector<int> c,d;
int main()
{
    int cas=0;
    while(cin>>n>>m)
    {
        c.clear(),d.clear();
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&b[i]);
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            int cur=i,cnt=1;
            if(!vis[i])
            {
                vis[i]=1;
                while(a[cur]!=i)
                {
                    cur=a[cur];
                    vis[cur]=1;
                    cnt++;
                }
                c.push_back(cnt);
            }
        }
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            int cur=i,cnt=1;
            if(!vis[i])
            {
                vis[i]=1;
                while(b[cur]!=i)
                {
                    cur=b[cur];
                    vis[cur]=1;
                    cnt++;
                }
                d.push_back(cnt);
            }
        }
         ll ans=1;
        for(int i=0;i<c.size();i++)
        {
            ll res=0;
            for(int j=0;j<d.size();j++)
            {
                if(c[i]%d[j]==0)
                    res=(res+d[j])%mod;
            }
            ans=(ans*res)%mod;
        }
        printf("Case #%d: %lld\n",++cas,ans);
    }
    return 0;
}
时间: 2024-10-23 17:37:58

6038 Function 数学(循环节)的相关文章

hdu 4506(数学,循环节+快速幂)

小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 5427    Accepted Submission(s): 1461 Problem Description 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这 不,班

HDU 6038 Function(思维+寻找循环节)

http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给出两个序列,一个是0~n-1的排列a,另一个是0~m-1的排列b,现在求满足的f的个数. 思路: 先看一下样例吧: 对于这组数来说,假如我们先指定了f(0)对应的在b中的值,那么根据第2个式子,就可以得出f(1),根据f(1)就又可以得出f(2),最后根据f(2)就可以检验f(0)的值是否正确. 这也就是说,对于a中的一个循环节,只要确定了其中一个数所映射的值,那么其它数就都被相应的确定了. 所

特征根法求通项+广义Fibonacci数列找循环节 - HDU 5451 Best Solver

Best Solver Problem's Link Mean: 给出x和M,求:(5+2√6)^(1+2x)的值.x<2^32,M<=46337. analyse: 这题需要用到高中的数学知识点:特征根法求递推数列通项公式. 方法是这样的: 对于这题的解法: 记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10 根据韦达定理可以推导出:λ1,λ2的特征方程为 x^2-10x+1=0 再使用该特征方程反向推导出递推公式为:a[n]=10*a[n-1]-a[n-2] 再由特征根

循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位. 下面的方法,可以求出循环节的长度. 请仔细阅读代码,并填写划线部分缺少的代码. public static int f(int n, int m) { n = n % m;   Vector v = new Vector(); for(;;) { v.add(n); n *= 10; n = n % m; if(n==0) ret

hud5451_求循环节加矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5451 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 找循环节解析链接:http://blog.csdn.net/ACdreamers/article/details/25616461 裸题链接:http://blog.csdn.net/chenzhenyu123456/article/details/48529039 1 #include <algorithm> 2 #i

poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the

51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)

1037 最长的循环节 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 10^18) Output 输出<=n的数中倒数循环节长度最长的

循环节的问题

SDUT  循环节 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节. 对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度最小的那一个为最小循环节. 输入 多组输入. 每组输入一个字符串,长度不大于80,只包含26个小写字母. 输出 输出一个字符串,代表最小循环节. 示例输入 aaaa abab 示例输出 a a

薛XX后代的IQ CSU1597【循环节】或【快速幂】

薛先生想改变后代的IQ,为此他发明了一种药,这种药有三种属性:A, B,P.他父亲的智商为X,薛先生的智商为Y,用了这种药之后,薛先生的孩子的智商就可以变为(AX+BY) mod P.后代的智商以此类推. 现在给定X和Y,还有药的属性A.B和P,现在他想知道他的N代子孙的IQ(儿子是第一代,孙子是第二代). Input第一行包含一个整数T(T<=100),表示数据组数 每组数据只有一行,包含六个整数X,Y,A,B,P,N(1 ≤ X, Y ≤ 300,1 ≤ A, B ≤ 30, 1≤ P ≤