装载自: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. 20145101《Java程序设计》第6周学习总结

    20145101<Java程序设计>第6周学习总结 教材学习内容总结 第十章输入和输出 java.io.InputStream.java.io.OutputStream实例分别作为输入.输 ...

  2. 20145304 Exp4 恶意代码分析

    20145304 Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控 ...

  3. 全球变暖|2018年蓝桥杯B组题解析第九题-fishers

    标题:全球变暖 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. .. ...

  4. mysql数据库分库分表(Sharding)

    mysql数据库切分 前言 通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制.一旦数据库过于庞大,尤其是当写入过于频繁,非常难由一台主机支撑的时候,我们还是会面临到扩展瓶 ...

  5. 【第十四章】 springboot + profile(不同环境读取不同配置)

    具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...

  6. c#进阶之Delegate

    委托是什么?答:委托是一种类型   等同与 一个class类,继承System.MulticastDelegate,但mult....gate是一个特殊类,不能够派生 委托的调用,如何去使用 1/委托 ...

  7. [TODO]The way to Go(9): 基本类型和运算符

    参考: Github: Go Github: The way to Go 基本类型和运算符 表达式是一种特定的类型的值,它可以由其它的值以及运算符组合而成. 每个类型都定义了可以和自己结合的运算符集合 ...

  8. Ubuntu 上 执行命令 java -version 显示 没有那个文件或目录

    解决方法 执行 which java 发现默认java目录:/usr/bin/java . 查看 JAVA_HOME 路径:$JAVA_HOME,得到 /usr/local/java/jdk1.7.0 ...

  9. windows 模拟用户会话创建进程

    在渗透当中,经常会碰到这样的问题.一个机器,机器上好几个用户,或者域内,想让某个机器的某个会话执行你想要执行的程序,或者中马,以当前会话来上线. 现在模拟如下的一个情况: 严格的DMZ,内网--> ...

  10. Robot framework(RF)学习基础

    1.框架特点 2.安装 3.基本内容 RF框架是通用的测试框架,一直由诺西网络维护. 易于使用 采用表格法 可以使用关键字驱动,数据驱动和行为驱动开发完成.(keyword-driven,data-d ...