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

    链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两 ...

  2. 论文解读(MPNN)Neural Message Passing for Quantum Chemistry

    论文标题:DEEP GRAPH INFOMAX 论文方向:  论文来源:ICML 2017 论文链接:https://arxiv.org/abs/1704.01212 论文代码: 1 介绍 本文的目标 ...

  3. 2020.12.20-Codeforces Round #105补题

    B - Escape The princess is going to escape the dragon's cave, and she needs to plan it carefully. Th ...

  4. Mysql双主双从高可用集群的搭建且与MyCat进行整合

    1.概述 老话说的好:瞻前顾后.患得患失只会让我们失败,下定决心,干就完了. 言归正传,之前我们聊了Mysql的一主一从读写分离集群的搭建,虽然一主一从或一主多从集群解决了并发读的问题,但由于主节点只 ...

  5. Bloom Filter算法

    Bloom Filter算法详解 什么是布隆过滤器 布隆过滤器(Bloom Filter)是 1970 年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数 (下面详细说),实际上你也可 ...

  6. 利用python爬取全国水雨情信息

    分析 我们没有找到接口,所以打算利用selenium来爬取. 代码 import datetime import pandas as pd from bs4 import BeautifulSoup ...

  7. Framework - 性能统计

    摘要 近期对接客户时,客户方希望提供 SDK 的性能.内存.隐私支持等一些数据,所以就对 SDK 进行了一些性能测试. 在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似 ...

  8. 腾讯bugly产生bug定位行数不准解决方案

    定位不准是因为做了混淆导致行数与实际代码行数不对.解决方案是要上传符号表.下载地址https://bugly.qq.com/v2/downloads 下载好因为我打开文件的说明文件是空文件(可能工作人 ...

  9. 【二食堂】Beta - Scrum Meeting 5

    Scrum Meeting 5 例会时间:5.18 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 划词功能已经实现,继续开发,完善文本区域交互,调用API issue 1. ...

  10. 「总结」$dp1$

    大概就是做点题. 先列一下要做的题目列表,从\(UOJ\)上找的. 129寿司晚宴 348州区划分 370滑稽树上滑稽果 457数树 22外星人 37主旋律 300吉夫特 196线段树 311积劳成疾 ...