题意:

给你一个方程,方程太变态不打,给你一个p一个k,p保证是大于等于3的质数,k保证在0~p-1之间的整数。要求对应函数的定义域在0~p-1值域为0~p-1的子集,求这样的函数有多少个...

分析:

【今天刚迷迷糊糊听了节集合论,做着做着就发现好像是循环群还是啥==】

k=0时,不难发现f(0)=0,其他任意。

k=1时,f(0)=f(0) mod p,发现除了其他任意外f(0)也任意。

当k>=2时,发现某规律...

不难发现假如k=2,则f(2)根据f(1),f(4)根据f(2)...以此类推,直到mod运算之后再次成为1...

所以很多组的值是根据其中某一个函数的值的变化而变化...所以发现了某规律(应该是可以证明推导的)

规律是这样的,发现<k>(这个符号的解释看离散数学==)的阶数就是将定义域划分的依据(这个应该是可以通过某著名定理推导出来,屌丝只是发现规律了)...

好的,最后这道题变成一道规律题了(学渣痛痛痛)

除了0外,定义域可以划分成w组,每组里边有<k>的阶个数字。剩下的事情就是排列组合一下,写一个快速幂求解...

反思:

这题反映了我这种学渣分析问题不全面,虽然1A但是交了之后才发现有个地方的验证自己忽略了...

代码:

#include<stdio.h>
int main()
{
int p,k;
int n=1e9+;
scanf("%d%d",&p,&k);
if(k==)
{
long long tmp=p,r=;
p--;
while(p)
{
if(p&)
{
r=r*tmp%n;
}
tmp=tmp*tmp%n;
p>>=;
}
printf("%I64d\n",r);
}
else if(k==)
{
long long tmp=p,r=;
while(p)
{
if(p&)
{
r=r*tmp%n;
}
tmp=tmp*tmp%n;
p>>=;
}
printf("%I64d\n",r);
}
else
{
long long tmp=;
long long ans;
for(int i=;;i++)
{
tmp=(tmp*k)%p;
if(tmp==)
{
ans=i;
break;
}
}
long long r=;
tmp=p;
p=(p-)/ans;
while(p)
{
if(p&)
{
r=r*tmp%n;
}
tmp=tmp*tmp%n;
p>>=;
}
printf("%I64d\n",r);
}
}

CodeForces 604D 【离散数学 置换群】的更多相关文章

  1. 【codeforces 604D】Moodular Arithmetic

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. 置换群(本蒟蒻瞎BB的)(未完)

    置换群(本蒟蒻瞎BB的)(未完) 群的定义 给定一个集合\(G=\{a, b, c...\}\)和集合\(G\)上的二元运算*,并满足: 封闭性:\(\forall a, b \in G, \exis ...

  3. Codeforces 441D Valera and Swaps(置换群)

    题意: 给定一个1~n的排列(n<=3000),输出字典序最小且次数最少的交换操作,使得操作后的排列可以通过最少m次交换得到排列[1,2,...n] Solution: 可以将排列的对应关系看做 ...

  4. pat1067 在离散数学中置换群思想上可用并查集和递归两种方法求解问题

    1.递归求解  注:叙述时 节点其实就是数字0-N-1 !!!最好用一个数组记录0-N-1每个数字的位置 !!!递归计算一个置换群内部的节点数 分为两种情况 累加M,M即是一个置换群所有数字在正确位置 ...

  5. CodeForces - 441D: Valera and Swaps(置换群)

    A permutation p of length n is a sequence of distinct integers p1, p2, ..., pn (1 ≤ pi ≤ n). A permu ...

  6. 【置换群】Codeforces Round #393 (Div. 1) A. Pavel and barbecue

    就是先看排列p,必须满足其是一个环,才满足题意.就处理出有几个环,然后把它们合起来,答案就是多少. 然后再看序列b,自己稍微画一画就会发现,如果有偶数个1肯定是不行哒,否则,它就会再置换一圈回到它自己 ...

  7. Codeforces Round #252 (Div. 2) D

    http://codeforces.com/problemset/problem/441/D 置换群的基本问题,一个轮换内交换成正常顺序需要k-1次,k为轮换内元素个数 两个轮换之间交换元素,可以把两 ...

  8. Codeforces Round 252 (Div. 2)

    layout: post title: Codeforces Round 252 (Div. 2) author: "luowentaoaa" catalog: true tags ...

  9. Codeforces Round #315 (Div. 2) (ABCD题解)

    比赛链接:http://codeforces.com/contest/569 A. Music time limit per test:2 seconds memory limit per test: ...

随机推荐

  1. eclipse报An error has occurred,See error log for more details. java.lang.NullPointerException错误

    eclipse报An error has occurred,See error log for more details. java.lang.NullPointerException错误,解决办法: ...

  2. Window下SVN命令的使用总结

    1 地址:http://subversion.apache.org/packages.html#windows 找到windows下的svn客户端工具.选择Win32Svn 进行安装. 一般环境变量会 ...

  3. Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN

    Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...

  4. svn钩子(hooks)

    首先你需要搭建出自己的svn环境出来,并能成功导入导出,并且了解svn,这是看这篇文章的前提.... 出于公司开发部需要svn同步更新服务器代码,需要用到svn钩子(hooks)技术,以前从来没听过, ...

  5. C#利用Windows API 实现关机、注销、重启等操作

    using System; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; nam ...

  6. OpenSSL库验证PKCS7签名

    使用Crypto库签名和验证签名请参考Crypto库实现PKCS7签名与签名验证,可以使用OpenSSL库验证Crypto签名,OpenSSL验证签名可使用简单的代码描述如下: //signature ...

  7. [转] matlab saveas 和imwrite的区别

    http://hi.baidu.com/curbzz/item/04a69e805fc334e3e596e035 saveas(handle,['目录','文件名']) 如果只有一幅图,handle设 ...

  8. PHP基础学习笔记(一)

    1.初步了解PHP+ php是一种运行在服务端的跨平台的脚本语言. + php语法: <?php echo "welcome!": ?> php像javascript语 ...

  9. redhat编译安装cmake

    将RHEL的yum软件源更换为CentOS的软件源之后,其中的cmake版本太低,为2.6.4版本,编译较新的软件时会提示cmake版本太低,所以有必要编译安装最新版的cmake.   1. 更换yu ...

  10. MySQL存储引擎【InnoDB、MyISAM、Memory】

    数据库,MySQL这样存在多存储引擎的数据库软件,清楚常见的存储引擎的区别,使用合适的存储引擎,使得项目跑的更顺畅,有时候对于一个项目,甚至比项目本身都重要.这篇文章,旨在浅谈常见的三种存储引擎的区别 ...