装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次。公式比较好推。f[n] = f[n-1]*f[n-2]。然后a和b系数都是呈斐波那契规律增长的。需要先保存下来指数。但是太大了。在这里不能用小费马定理。要用降幂公式取模、
(A^x)%C=A^(x%phi(C)+phi(C))%C(x>=phi(C)) Phi[C]表示不大于C的数中与C互质的数的个数,可以用欧拉函数来求。

矩阵快速幂也不熟、。觉得很难。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000005 int visit[N],prime[N],K;
long long P,Phi; struct matrix
{
long long A[][];
}; void intt() // 找出1000000以内的素数
{
int i,j;
memset(visit,,sizeof(visit));
for(i=; i<=; i++)
{
if(visit[i]==)
{
for(j=i+i; j<=; j+=i)
{
visit[j]=;
}
}
}
K=;
for(j=; j<=; j++)
if(visit[j]==) prime[++K]=j;
} matrix power(matrix ans1,matrix ans2) // 矩阵乘法
{
int i,j,k;
matrix ans;
for(i=; i<=; i++)
{
for(j=; j<=; j++)
{
ans.A[i][j]=;
for(k=; k<=; k++)
{
ans.A[i][j]+=ans1.A[i][k]*ans2.A[k][j];
if(ans.A[i][j]>Phi)
{
ans.A[i][j]=ans.A[i][j]%Phi+Phi;
}
}
}
}
return ans;
} matrix mod(matrix un, long long k) // 求矩阵的k次幂
{
matrix ans;
ans.A[][]=;
ans.A[][]=;
ans.A[][]=;
ans.A[][]=;
while(k)
{
if(k%) ans=power(ans,un);
un=power(un,un);
k/=;
}
return ans;
} long long mod1(long long a, long long k) //求(a^k)%p
{
long long ans;
ans=;
while(k)
{
if(k%)
{
ans=ans*a;
ans%=P;
}
a=a*a;
a%=P;
k/=;
}
return ans%P;
} int main()
{
int i,ncase,t;
long long a,b,aa,bb,n,num,num1,num2;
matrix init,ans; intt();
scanf("%d",&ncase); for(t=; t<=ncase; t++)
{
scanf("%I64d%I64d%I64d%I64d",&a,&b,&P,&n);
printf("Case #%d: ",t);
if(n==)
{
printf("%I64d\n",a%P);
continue;
}
else if(n==)
{
printf("%I64d\n",b%P);
continue;
}
else if(n==)
{
printf("%I64d\n",a*b%P);
continue;
}
if(P==)
{
printf("0\n");
continue;
} // 初始化求斐波那契数的初始矩阵
init.A[][]=;
init.A[][]=;
init.A[][]=;
init.A[][]=;
// A^B % C = A ^ ( B % phi[C] + phi[C] ) %C ( B >= phi[C] ) ,phi[C]表示与C互质的数的个数
Phi=;
num=P; for(i=; i<=K; i++)
{
if(prime[i]>P) break;
if(P%prime[i]==)
{
Phi*=(prime[i]-);
num/=prime[i];
}
}
//phi[C]=C*(1-1/p1)*(1-1/p2)*...*(1-1/pt);p1,p2,...pt表示C的素因子
Phi*=num;//Phi表示phi[C] 在这里c = p ans=mod(init,n-);//求指数
num1=ans.A[][];//a的指数
num2=ans.A[][]+ans.A[][];//b的指数 求b的指数不是已经溢出了吗。???
if(num2>Phi) num2=num2%Phi+Phi; aa=mod1(a,num1);//a^num1%p;
bb=mod1(b,num2);//b^num2%p; printf("%I64d\n",aa*bb%P);
}
return ;
}

HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂的更多相关文章

  1. hdu 5895(矩阵快速幂+欧拉函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5895 f(n)=f(n-2)+2*f(n-1) f(n)*f(n-1)=f(n-2)*f(n-1)+2 ...

  2. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  3. [bzoj 1409] Password 矩阵快速幂+欧拉函数

    考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p ...

  4. HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  5. Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)

    传送门 题目 \[ \begin{aligned} &f_n=c^{2*n-6}f_{n-1}f_{n-2}f_{n-3}&\\ \end{aligned} \] 思路 我们通过迭代发 ...

  6. hdu4549 矩阵快速幂 + 欧拉降幂

    R - M斐波那契数列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. Super A^B mod C (快速幂+欧拉函数+欧拉定理)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...

  8. hdu 2814 快速求欧拉函数

    /** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...

  9. hdu 2824 The Euler function(欧拉函数)

    题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...

随机推荐

  1. 20145216史婧瑶《网络对抗》逆向及Bof进阶实践

    20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...

  2. 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

    多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...

  3. VC++ PathFindFileName函数,由文件路径获得文件名

    1.PathFindFileName函数的作用是返回路径中的文件名. PTSTR PathFindFileName( __in PTSTR pPath ); pPath是指向文件路径字符串的指针,函数 ...

  4. BZOJ 3529 数表(莫比乌斯+树状数组)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3529 题意:有一张n×m的数表,其第i行第j列的数值为能同时整除i和j的所有自然数 ...

  5. linux下获取本机的获取内网和外网地址

    1.获取内网地址(私有地址) ifconfig -a 2.获取外网地址(公网地址) curl members.3322.org/dyndns/getip

  6. 2018 Machine Learning

    2018/8/13 线性模型(西瓜书P53~P73) Optimizer https://blog.csdn.net/u012151283/article/details/78154917 2018/ ...

  7. 瞎折腾之Webhooks

    之前听学长介绍过webhooks,也知道有这个东西,但没有真正的用于项目部署,长久以来一直过着“刀耕火种”的生活......长久以来,都是这么更新代码的: 由于之前做的项目刚刚上线,需要对其进行持续的 ...

  8. ovs-ofctl: s1 is not a bridge or a socket 解决方法

    参考: ovs-vsctl: Error detected while setting up bridge ovs-ofctl: s1 is not a bridge or a socket 解决方法 ...

  9. UVa 11491 奖品的价值

    https://vjudge.net/problem/UVA-11491 题意:一个n位整数,删除其中的d个数字,输出最大值. 思路:肯定从高位开始分析,代码如下. #include<strin ...

  10. UVa 140 带宽

    题意:给出一个n个结点的图G和一个结点的排列,定义结点的带宽为i和相邻结点在排列中的最远距离,求出让带宽最小的结点排列. 思路:用STL的next_permutation来做确实是很方便,适当剪枝一下 ...