如果两个数$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. hd-cg辉度通用代码生成器

    HD-CG 辉度通用代码生成器 主要特点: 1. 自定义代码模板:通过简单的默认变量自行编写代码模板,如果默认变量不满足需求,也可增加自定义变量. 2. 自定义数据源:可自定义添加多个项目的数据库,数 ...

  2. Apache Dubbo理解和应用

    官网:https://dubbo.apache.org/ slogan:高性能.轻量级的开源Java RPC框架 提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和 ...

  3. 以太坊web3开发初步学习

    以太坊web3开发初步学习 此文是对https://learnblockchain.cn/2018/04/15/web3-html/的学习再理解. 以太坊智能合约通过使用web3.js前端和智能合约交 ...

  4. HttpRunner3.X - 实现参数化驱动

    一.前言 HttpRunner3.X支持三种方式的参数化,参数名称的定义分为两种情况: 独立参数单独进行定义: 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接. 数据源指定支持三 ...

  5. st表树状数组入门题单

    预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...

  6. 【UE4 C++ 基础知识】<8> Delegate 委托

    概念 定义 UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系. 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到 ...

  7. 关于STM32 (Cortex-M3) 中NVIC的分析

    一.STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作"亚优先级"或" ...

  8. 洛谷 P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈

    链接: P2252 [SHOI2002]取石子游戏|[模板]威佐夫博弈 前言: 第一眼大水题,第二眼努力思考,第 N 眼我是大水逼. 题意: 不看题目标题都应该能看出来是取石子类的博弈论. 有两堆石子 ...

  9. Java并发:Condition接口

    Condition 接口与 Lock 配合实现了等待 / 通知模式,这个和 Object 的监视器方法(wait.notify.notifyAll 等方法)一样,都是实现了等待 / 通知模式,但这两者 ...

  10. 猫狗收容所 牛客网 程序员面试金典 C++

    猫狗收容所 牛客网 程序员面试金典 C++ 题目描述 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或 ...