如果两个数$a_{x}$和$a_{y}$,$\exists 0<i,a_{x}^{i}\equiv a_{y}(mod\ p^{k})$,就建一条$x$到$y$的有向边,再对这张图强连通分量缩点,记$s_{i}$表示第$i$个点的大小,$f_{i}$表示能到达$i$的点(初始)数量,则答案为$\sum_{i=1}^{scc}\frac{2^{s_{i}}-1}{2^{s_{i}+f_{i}}}$(对每一个点分别统计贡献)
问题就变为如何判定$\exists i,x^{i}\equiv y(mod\ p^{k})$,分为$p\mid x$和$p\nmid x$两类
对于$x\mid p$和$y\nmid p$,$x^{i}\equiv y(mod\ p^{k})$的必要条件为$x^{i}\equiv y(mod\ p)$,而$x^{i}\equiv 0\ne y(mod\ p)$(交换$x$和$y$也同理可以证明),因此两类之间没有关系
对于$x\mid p$和$y\mid p$,必然有$\forall k\le i,x^{i}\equiv 0(mod\ p^{k})$,暴力枚举$i$即可,时间复杂度$o(n\log p)$
对于$x\nmid p$和$y\nmid p$,如果求出$且ord(x)=\min_{i>0且x^{i}\equiv 1(mod\ p^{k})}i$,那么$x^{i}\equiv y(mod\ p^{k})$当且仅当$ord(y)\mid ord(x)$
用BSGS求$ord(x)$复杂度及常数较大,考虑$ord(x)\mid \varphi(p)$,枚举$\varphi(p)$的质因子并判断能否消除,复杂度为$o(n\log^{2}p)$

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 5005
  4. 4 #define mod 998244353
  5. 5 map<int,int>mat;
  6. 6 vector<int>v,v1[N],v2[N],v3[N];
  7. 7 int n,m,P,p,k,ans,a[N],ord[N],vis[N],dfn[N],sz[N],bl[N],dp[N];
  8. 8 int ksm(int n,int m,int p){
  9. 9 if (!m)return 1;
  10. 10 int s=ksm(n,m>>1,p);
  11. 11 s=1LL*s*s%p;
  12. 12 if (m&1)s=1LL*s*n%p;
  13. 13 return s;
  14. 14 }
  15. 15 int bsgs(int k){
  16. 16 int ans=1;
  17. 17 for(int i=0;i<v.size();i++)ans=ans*v[i];
  18. 18 for(int i=0;i<v.size();i++)
  19. 19 if (ksm(k,ans/v[i],P)==1)ans/=v[i];
  20. 20 return ans;
  21. 21 }
  22. 22 void add(int x,int y){
  23. 23 v1[x].push_back(y);
  24. 24 v2[y].push_back(x);
  25. 25 }
  26. 26 void dfs1(int k){
  27. 27 if (vis[k])return;
  28. 28 vis[k]=1;
  29. 29 for(int i=0;i<v1[k].size();i++)dfs1(v1[k][i]);
  30. 30 dfn[++dfn[0]]=k;
  31. 31 }
  32. 32 void dfs2(int k){
  33. 33 if (bl[k]){
  34. 34 if (bl[k]!=m)v3[m].push_back(bl[k]);
  35. 35 return;
  36. 36 }
  37. 37 sz[m]++;
  38. 38 bl[k]=m;
  39. 39 for(int i=0;i<v2[k].size();i++)dfs2(v2[k][i]);
  40. 40 }
  41. 41 void dfs3(int k,int x){
  42. 42 if (vis[k])return;
  43. 43 vis[k]=1;
  44. 44 dp[x]+=sz[k];
  45. 45 for(int i=0;i<v3[k].size();i++)dfs3(v3[k][i],x);
  46. 46 }
  47. 47 void init(){
  48. 48 p=P;
  49. 49 for(int i=3;i*i<=P;i++)
  50. 50 if (P%i==0){
  51. 51 p=i;
  52. 52 break;
  53. 53 }
  54. 54 for(int i=P;i>1;i/=p)k++;
  55. 55 int j=P/p*(p-1);
  56. 56 for(int i=2;i*i<=j;i++)
  57. 57 while (j%i==0){
  58. 58 j/=i;
  59. 59 v.push_back(i);
  60. 60 }
  61. 61 if (j>1)v.push_back(j);
  62. 62 }
  63. 63 void Kosaraju(){
  64. 64 memset(vis,0,sizeof(vis));
  65. 65 for(int i=1;i<=n;i++)dfs1(i);
  66. 66 for(int i=n;i;i--)
  67. 67 if (!bl[dfn[i]]){
  68. 68 m++;
  69. 69 dfs2(dfn[i]);
  70. 70 }
  71. 71 }
  72. 72 int main(){
  73. 73 scanf("%d%d",&n,&P);
  74. 74 init();
  75. 75 for(int i=1;i<=n;i++){
  76. 76 scanf("%d",&a[i]);
  77. 77 mat[a[i]]=i;
  78. 78 }
  79. 79 for(int i=1;i<=n;i++)
  80. 80 if (a[i]%p)ord[i]=bsgs(a[i]);
  81. 81 else{
  82. 82 for(int j=1,t=a[i];t>0;j++,t=1LL*t*a[i]%P)
  83. 83 if ((mat[t])&&(mat[t]!=i))add(i,mat[t]);
  84. 84 }
  85. 85 for(int i=1;i<=n;i++)
  86. 86 for(int j=1;j<=n;j++)
  87. 87 if ((i!=j)&&(ord[i])&&(ord[j])&&(ord[i]%ord[j]==0))add(i,j);
  88. 88 Kosaraju();
  89. 89 for(int i=1;i<=m;i++){
  90. 90 memset(vis,0,sizeof(vis));
  91. 91 dfs3(i,i);
  92. 92 }
  93. 93 for(int i=1;i<=n;i++)ans=(ans+(ksm(2,sz[i],mod)-1LL)*ksm(2,n-dp[i],mod))%mod;
  94. 94 printf("%d",ans);
  95. 95 return 0;
  96. 96 }

[loj3330]猜数游戏的更多相关文章

  1. 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)

    1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...

  2. usaco 猜数游戏

    Description 为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏.游戏开始前,贝西会在牛棚后面摆上N个数字.所有数字排成一条直线,按次序从1到N编号.每个数字在1到10^9之间,没有两个数字 ...

  3. (一)Python之猜数游戏

    猜数游戏由简如深的编码学习过程: 3次机会: print('------------------我爱鱼C工作室------------------')count=0while count < 3 ...

  4. 猜数游戏-flag的运用

    package my;import java.util.Scanner;public class MyJava {        public static void main(String[] ar ...

  5. Java课程设计——猜数游戏(201521123111 陈伟泽)

    Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...

  6. JAVA课程设计 猜数游戏 团队

    团队名称,成员介绍 名称: 猜数游戏 成员: 网络1514 201521123086 周颖强 网络1514 201521123087蒋勃超 项目git地址 git.oschina.net/jbc113 ...

  7. BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

    2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status ...

  8. 从scratch到python——猜数游戏

    ` 之前讲解了从scratch到python,基于python turtle库的实现,讲解了用scratch和python turtle绘图的实现,以及让小猫动起来和当角色被单击的例子. 本节课讲继续 ...

  9. VBS猜数游戏

    VBS 猜数游戏 2018-11-09  21:19:11 by xutao msgbox "The Swami" ,,"Game" msgbox " ...

随机推荐

  1. IDA硬编码修改SO,重新打包APK绕过FRIDA反调试

    该案例来自看雪 通过IDA修改SO 找到检测点 修改字符串 双击该字符串进入TEXT VIEW 选择 HEX VIEW 修改十六进制 右击EDIT 修改字符 右击 菜单栏-> edit -> ...

  2. javascript-jquery插件

    1.jquery创建插件 jQuery.extend({插件名:函数体,插件名:函数体}): html部分 <div id="div1">开始动画</div> ...

  3. 为Kubernetes集群添加用户认证

    Kubernetes中的用户 K8S中有两种用户(User)--服务账号(ServiceAccount)和普通意义上的用户(User) ServiceAccount是由K8S管理的,而User通常是在 ...

  4. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  5. Java:关于 CAS 笔记

    Java:关于 CAS 笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. CAS 底层原理 概念 CAS 的全称是 Compare-And-Swap,它 ...

  6. 第五次Alpha Scrum Meeting

    本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...

  7. 第6次 Beta Scrum Meeting

    本次会议为Beta阶段第6次Scrum Meeting会议 会议概要 会议时间:2021年6月8日 会议地点:「腾讯会议」线上进行 会议时长:15min 会议内容简介:对完成工作进行阶段性汇报:对下一 ...

  8. 2021.10.18考试总结[NOIP模拟76]

    T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...

  9. hdu 3047 Zjnu Stadium(并查集)

    题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...

  10. WPF_02_XAML

    XAML(Extensible Application Markup Language的简写)是用于实例化.NET对象的标记语言.XAML对于WPF不是必须的. XAML基础 XAML标准: XAML ...