HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
装载自: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 矩阵快速幂+欧拉函数+降幂公式降幂的更多相关文章
- 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 ...
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- [bzoj 1409] Password 矩阵快速幂+欧拉函数
考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p ...
- HDU 4549 矩阵快速幂+快速幂+欧拉函数
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 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} \] 思路 我们通过迭代发 ...
- hdu4549 矩阵快速幂 + 欧拉降幂
R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Super A^B mod C (快速幂+欧拉函数+欧拉定理)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...
- hdu 2814 快速求欧拉函数
/** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...
- hdu 2824 The Euler function(欧拉函数)
题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...
随机推荐
- 20145304 Exp5 MSF基础应用
20145304 Exp5 MSF基础应用 实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit是生成或启动已经设置好的攻击程序,获得相应权限.在实 ...
- Android实践项目汇报(三)
Google天气客户端 本周学习计划 调试代码使之成功运行并实现天气预报功能. 实际完成情况 由于google取消api接口服务,天气源的传输.所以我换了一个使用 haoserver API接口的程序 ...
- P3938 斐波那契
思路 脑子还真的是好东西,自己太笨了 容易发现父亲节点和儿子节点的关系 儿子节点大于父亲节点 儿子节点和父亲节点之差为斐波那契数,且斐波那契数为小于儿子节点的最大的一个 1e12中有60左右的斐波那契 ...
- IIS中添加ftp站点
1.创建Windows账号 右击点击“我的电脑”,选择“管理”打开服务器管理的控制台.展开“服务器管理器”,一路展开“配置”.“本地用户和组”,点“用户”项.然后在右边空白处点右键,选择“新用户”将打 ...
- LA 4329 乒乓比赛
https://vjudge.net/problem/UVALive-4329 题意: 一条大街上住着n个兵乓球爱好者,经常组织比赛切磋技术.每个人都有一个不同的技能值ai.每场比赛需要3个人:两名选 ...
- ZOJ 3469 Food Delivery(区间DP)
https://vjudge.net/problem/ZOJ-3469 题意:在一条直线上有一个餐厅和n个订餐的人,每个人都有随时间上升的不满意值,从餐厅出发,计算出送完时最小的不满意值总和. 思路: ...
- C# string[]转List<string>
List<string> ltProduct = new List<string>(Product.Split('|'));
- hdu 3579 Hello Kiki 不互质的中国剩余定理
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- jekins 实现Django项目的自动部署(ubuntu16.04,python2.7,django1.11)
1.依赖的插件 如果插件下载失败 更换源 http://mirror.xmission.com/jenkins/updates/current/update-center.json 因为我们只需要构建 ...
- 趣味工具figlet
sudo apt-get install figlet $ echo "Hello" | figlet _ _ _ _ | | | | ___| | | ___ | |_| |/ ...