题意:

给出题意中那么个函数,给出a、b、p、n,求函数调用的次数(mod p)。


思路:

能很容易看出来a和b的阶数是斐波那契数,n过大,用矩阵快速幂求斐波那契数,然后用欧拉函数进行取模的优化。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;#define maxn 1000050
long long a,b,n,p;
long long minDiv[maxn],phi[maxn],sum[maxn];void genphi()
{for(long long i=1; i<maxn; i++){minDiv[i]=i;}for(long long i=2; i*i<maxn; i++){if(minDiv[i]==i){for(long long j=i*i; j<maxn; j+=i){minDiv[j]=i;}}}phi[1]=1;for(long long i=2; i<maxn; i++){phi[i]=phi[i/minDiv[i]];if((i/minDiv[i])%minDiv[i]==0){phi[i]*=minDiv[i];}else{phi[i]*=minDiv[i]-1;}}return ;
}struct matrix
{long long A[2][2];
};long long Phi;
matrix power(matrix ans1,matrix ans2)
{int i,j,k;matrix ans;for(i=0; i<=1; i++){for(j=0; j<=1; j++){ans.A[i][j]=0;for(k=0; k<=1; 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)
{matrix ans;ans.A[0][0]=1;ans.A[0][1]=0;ans.A[1][0]=0;ans.A[1][1]=1;while(k){if(k%2) ans=power(ans,un);un=power(un,un);k/=2;}return ans;
}long long pow_mod(long long a,long long k)
{long long ans;ans=1;while(k){if(k%2){ans=ans*a;ans%=p;}a=a*a;a%=p;k/=2;}return ans%p;
}int main()
{genphi();//printf("%lld\n",phi[100015]);int t;int cas=1;//for(int i=1;i<=13;i++)//  printf("%d %lld\n",i,phi[i]);//freopen("in.txt","r",stdin);scanf("%d",&t);while(t--){scanf("%lld%lld%lld%lld",&a,&b,&p,&n);printf("Case #%d: ",cas++);if(n==1){printf("%lld\n",a%p);continue;}else if(n==2){printf("%lld\n",b%p);continue;}else if(n==3){printf("%lld\n",a*b%p);continue;}matrix init;init.A[0][0]=0;init.A[0][1]=1;init.A[1][0]=1;init.A[1][1]=1;//printf("%lld\n",phi[1]);Phi=phi[p];//printf("%lld\n",Phi);matrix zhi=mod(init,n-3);long long azhi=zhi.A[1][1];long long bzhi=zhi.A[0][1]+zhi.A[1][1];if(bzhi>Phi)bzhi=bzhi%Phi+Phi;long long aa1=pow_mod(a,azhi);long long aa2=pow_mod(b,bzhi);printf("%lld\n",aa1*aa2%p);}return 0;
}

uvalive4744(数论)相关推荐

  1. 数论(一)——素数,GCD,LCM

    这是一个数论系列:) 一.素数 ×费马小定理 Theorem: 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么 很遗憾,费马小定理的逆定理是不成立的.对 a = 2,满足的非素数 n 是存 ...

  2. 【数论总结】-----励志写好一篇数论总结↖(^ω^)↗//正在施工...未完工

    近期学了学数论,来写一波总结吧. (1)排列组合,比较基础的东西了吧.//只写个概念吧,(逃: 概念:就是从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合: ...

  3. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  5. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  6. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...

  7. 《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  8. 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  9. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. 2021年大数据常用语言Scala(一):Scala简介
  2. dataimagepng php_nginx无法打开 dataimage/php
  3. 两台路由器之间建立邻接关系的过程即报文信息交换过程
  4. Android onPause()和onStop()区别
  5. Cloud Studio全文搜索功能介绍
  6. SwiftUI之深入解析高级动画的时间轴TimelineView
  7. oracle数据库中对varchar类型求max的解决方法
  8. eclipse/myeclipse中如何开启断言调试代码
  9. 项目需求分析——如何理解和识别系统需求?
  10. 什么是HDMIARC
  11. 开源一个适用iOS的数据库表结构更新机制的代码
  12. C语言选择题(含答案)
  13. flv怎么转换成html5,快速教你如何将FLV转换MP4格式
  14. 阿里云产品推荐——云数据库RDS MySQL 版
  15. Excel如何给单元格加斜线
  16. 仿bilibili微信小程序一
  17. 如何将Word中数据转换为excel表格
  18. Android 差分包制作流程分析
  19. EasyPusher进行Android UVC外接摄像头直播推送实现方法
  20. 下载并安装vue-devtools(详细步骤)

热门文章

  1. 科大星云诗社动态20201231
  2. 云炬随笔20190701
  3. 一键导出Origin图片MATLAB代码
  4. 云炬VB开发笔记 4选择结构
  5. python字符串与文本处理技巧(2):大小写敏感搜索、最短匹配、多行匹配、Unicode标准化
  6. 如何调用DLL (基于Visual C++6.0的DLL编程实现)
  7. eclipse导入Java文件后出现中文乱码
  8. JVM_03 运行时数据区 [ 程序计数器+本地方法栈 ]
  9. Mysql:kill命令之mysql杀死指定的进程(批操作)
  10. 强联通分量算法的个人详解Tarjan算法(包含缩点)