利用降幂公式。。呃,还是自己去搜题解吧。知道降幂公式后,就不难了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #define LL unsigned long long
  6. using namespace std;
  7.  
  8. bool mod[100005];
  9.  
  10. LL PHI(LL P){
  11. LL ret=1;
  12. for(LL i=2;i*i<=P;i++)
  13. if(P%i==0){
  14. ret*=i-1;
  15. P/=i;
  16. while(P%i==0){
  17. P/=i;
  18. ret*=i;
  19. }
  20. }
  21. if(P>1)
  22. ret*=P-1;
  23. return ret;
  24. }
  25.  
  26. LL quick(LL a,LL k,LL m){
  27. LL ret=1; LL t=a%m;
  28. while(k){
  29. if(k&1) ret=(ret*t)%m;
  30. k>>=1;
  31. t=(t*t)%m;
  32. }
  33. return ret;
  34. }
  35.  
  36. int main(){
  37. int T;
  38. LL b,P,M;
  39. scanf("%d",&T);
  40. for(int kase=1;kase<=T;kase++){
  41. scanf("%I64u%I64u%I64u",&b,&P,&M);
  42. printf("Case #%d: ",kase);
  43. if(P==1){
  44. if(M==18446744073709551615ULL)
  45. printf("18446744073709551616\n");
  46. else
  47. printf("%I64u\n",M+1);
  48. continue;
  49. }
  50. LL phi=PHI(P);
  51. LL i,ans;
  52. LL fac=1; ans=0;
  53. for(i=0;i<=M&&fac<=phi;i++){
  54. if(quick(i,fac,P)==b){
  55. ans++;
  56. }
  57. fac*=(i+1);
  58. }
  59. fac%=phi;
  60. for(;i<=M&&fac;i++){
  61. if(quick(i,fac,P)==b)
  62. ans++;
  63. fac=(fac*(i+1))%phi;
  64. }
  65. if(i<=M){
  66. memset(mod,false,sizeof(mod));
  67. LL cn=0;
  68. for(LL k=0;k<P;k++){
  69. if(quick(i+k,phi,P)==b){
  70. mod[k]=true;
  71. cn++;
  72. }
  73. }
  74. ans+=((M-i+1)/P)*cn;
  75. LL e=(M-i+1)%P;
  76. for(LL k=0;k<e;k++)
  77. if(mod[k])
  78. ans++;
  79. }
  80. printf("%I64u\n",ans);
  81. }
  82. return 0;
  83. }

  

HDU 4335 Contest 4的更多相关文章

  1. 数论 + 公式 - HDU 4335 What is N?

    What is N? Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4335 Mean: 给你三个数b.P.M,让你求有多少个n满 ...

  2. HDU 5045 Contest(状压DP)

    Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...

  3. hdu - 5045 - Contest(国家压缩dp)

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...

  4. [ACM] hdu 5045 Contest (减少国家Dp)

    Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...

  5. HDU–5988-Coding Contest(最小费用最大流变形)

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. hdu 4335 What is N?

    此题用到的公式:a^b%c=a^(b%phi(c)+phi(c))%c (b>=phi(c)). 1.当n!<phi(p)时,直接暴力掉: 2.当n!>=phi(p) &&a ...

  7. hdu 5045 Contest(状态压缩DP)

    题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...

  8. HDU 5045 Contest

    pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...

  9. HDU 4339 Contest 4

    树状数组,主要是抓住要求连续1的个数.这样,初始时,相同的加1,不同的加0. 查询时,用二分搜索右边界.就是比较当前mid-l+1的值与他们之间1的个数(这可以通过树状数组求区间和得出),记录右边界即 ...

随机推荐

  1. 在MVC中使用泛型仓储模式和依赖注入实现增删查改

    标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...

  2. Microsoft Dynamics CRM 2013 for Outlook 的硬件要求

    当仅联机或脱机模式下执行 Microsoft Dynamics CRM 2013 for Microsoft Office Outlook 时,下表列出了建议的最低硬件要求 watermark/2/t ...

  3. UML基本架构建模--获取类

     Getting Started 開始 Modeling a system involves identifying the things that are important to your p ...

  4. C#实现调用接口数据获取数据格式化XML、json转成Table的方法

    废话不多说,直接上代码: json 格式化转DataTable: result为从接口得到的数据,格式化json的方法主要来自Newtonsoft.Json JObject joUnit = JObj ...

  5. C++实现位数组

    当我们遇到大量整数排序时候为了节省内存空间我们能够考虑使用bit数组来实现,缺点是其仅仅适用于正整数. 思想: 在32位系统一个int类型占4个字节,按位来计算一个int类型能够记录32个数.因此,採 ...

  6. Swift3.0 闭包整理

    语法表达式 一般形式:{             (parameters) -> returnType in              statements            } 这里的参数 ...

  7. Redis常用的命令

    常规命令查询地址: http://redisdoc.com/ 如下图:

  8. Python 之 PyCharm使用

    PyCharm  的官方网站地址是:https://www.jetbrains.com/pycharm/download/ 教育版:https://www.jetbrains.com/pycharm- ...

  9. Linux常见后缀缩写含义

    ctl: control rc: run control (A run-control file is a file of declarations or commands associated wi ...

  10. (转)硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程

    硬盘结构硬盘有很多盘片组成,每个盘片的每个面都有一个读写磁头.如果有N个盘片.就有2N个面,对应2N个磁头(Heads),从0.1.2开始编号.每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电 ...