装载自: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. 判断某个ImageView的背景图是否是已知的背景图相等

    if (ibtn.getDrawable().getConstantState().equals(getResources().getDrawable(R.mipmap.image).getConst ...

  2. nmap参数思维导图

    链接:https://pan.baidu.com/s/1vD0A6olQbVNmCCirpHBm0w 提取码:o994

  3. 记录openwrt下补丁apply的过程中出错,但是可以单独打上该补丁

    背景: 在openwrt的编译框架下无法正确打上补丁,而单独使用git却可以成功 这个补丁到底与其它补丁有何不同? 该补丁的生成的过程解析: 旧文件:vi 打开旧文件会提示no newline at ...

  4. POJ 1260 Pearls (斜率DP)题解

    思路: 直接DP也能做,这里用斜率DP. dp[i] = min{ dp[j] + ( sum[i] - sum[j] + 10 )*pr[i]} ; k<j<i  =>  dp[j ...

  5. 同一主机配置:vsftpd+pam+mysql

    两种情况: 1.vsftpd和MySQL不在同一台主机上 vsftpd服务器和MySQL服务器不在同一台主机上时,vsftpd服务器需要安装pam_mysql. 在指定用户认证时,vsftpd需要链接 ...

  6. (转)Linux I/O 调度方法

    Linux I/O 调度方法 转自https://blog.csdn.net/theorytree/article/details/6259104 操作系统的调度有 CPU调度    CPU sche ...

  7. GATK 一些资料

    1. http://blog.sciencenet.cn/home.php?mod=space&uid=1469385&do=blog&classid=166694&v ...

  8. WPF基础学习笔记整理 (五) DependencyObject & DependencyProperty

    参考资料: 1.http://www.cnblogs.com/Zhouyongh/archive/2009/10/20/1586278.html 基础知识: DependencyObject & ...

  9. Cocos2d-x学习笔记(九)场景切换

    这里只介绍两个简单的两个场景相互切换的方法. void pushScene(Scene *sn)和void popScene(Scene *sn)是一对.前者将当前场景放入到场景堆栈中,并切换到下一个 ...

  10. 内存溢出和内存泄漏 mark下

    https://jingyan.baidu.com/article/495ba841e4423438b30edeb5.html https://www.cnblogs.com/hyh-test/p/8 ...