装载自: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. 20145304 Exp5 MSF基础应用

    20145304 Exp5 MSF基础应用 实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit是生成或启动已经设置好的攻击程序,获得相应权限.在实 ...

  2. Android实践项目汇报(三)

    Google天气客户端 本周学习计划 调试代码使之成功运行并实现天气预报功能. 实际完成情况 由于google取消api接口服务,天气源的传输.所以我换了一个使用 haoserver API接口的程序 ...

  3. P3938 斐波那契

    思路 脑子还真的是好东西,自己太笨了 容易发现父亲节点和儿子节点的关系 儿子节点大于父亲节点 儿子节点和父亲节点之差为斐波那契数,且斐波那契数为小于儿子节点的最大的一个 1e12中有60左右的斐波那契 ...

  4. IIS中添加ftp站点

    1.创建Windows账号 右击点击“我的电脑”,选择“管理”打开服务器管理的控制台.展开“服务器管理器”,一路展开“配置”.“本地用户和组”,点“用户”项.然后在右边空白处点右键,选择“新用户”将打 ...

  5. LA 4329 乒乓比赛

    https://vjudge.net/problem/UVALive-4329 题意: 一条大街上住着n个兵乓球爱好者,经常组织比赛切磋技术.每个人都有一个不同的技能值ai.每场比赛需要3个人:两名选 ...

  6. ZOJ 3469 Food Delivery(区间DP)

    https://vjudge.net/problem/ZOJ-3469 题意:在一条直线上有一个餐厅和n个订餐的人,每个人都有随时间上升的不满意值,从餐厅出发,计算出送完时最小的不满意值总和. 思路: ...

  7. C# string[]转List<string>

    List<string> ltProduct = new List<string>(Product.Split('|'));

  8. hdu 3579 Hello Kiki 不互质的中国剩余定理

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  9. jekins 实现Django项目的自动部署(ubuntu16.04,python2.7,django1.11)

    1.依赖的插件 如果插件下载失败 更换源 http://mirror.xmission.com/jenkins/updates/current/update-center.json 因为我们只需要构建 ...

  10. 趣味工具figlet

    sudo apt-get install figlet $ echo "Hello" | figlet _ _ _ _ | | | | ___| | | ___ | |_| |/ ...