【codeforces 604D】Moodular Arithmetic
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
As behooves any intelligent schoolboy, Kevin Sun is studying psycowlogy, cowculus, and cryptcowgraphy at the Bovinia State University (BGU) under Farmer Ivan. During his Mathematics of Olympiads (MoO) class, Kevin was confronted with a weird functional equation and needs your help. For two fixed integers k and p, where p is an odd prime number, the functional equation states that
for some function . (This equation should hold for any integer x in the range 0 to p - 1, inclusive.)
It turns out that f can actually be many different functions. Instead of finding a solution, Kevin wants you to count the number of distinct functions f that satisfy this equation. Since the answer may be very large, you should print your result modulo 109 + 7.
Input
The input consists of two space-separated integers p and k (3 ≤ p ≤ 1 000 000, 0 ≤ k ≤ p - 1) on a single line. It is guaranteed that p is an odd prime number.
Output
Print a single integer, the number of distinct functions f modulo 109 + 7.
Examples
input
3 2
output
3
input
5 4
output
25
Note
In the first sample, p = 3 and k = 2. The following functions work:
f(0) = 0, f(1) = 1, f(2) = 2.
f(0) = 0, f(1) = 2, f(2) = 1.
f(0) = f(1) = f(2) = 0.
【题目链接】:http://codeforces.com/contest/604/problem/D
【题解】
题意:
给你一个关于某个函数的恒等式;
让你找出符合这个恒等式的所有函数f;
函数的自变量和函数值都是整数
自变量从0到p-1变化;
函数的值域范围也是0..p-1
做法:
分类讨论
①当k=0的时候->f(0)=0
则可知除了f(0)固定之外,其他的f(1)..f(p-1)都可以随便取(每个f(x)都有p种可能)
所以答案是p^(p-1);
②当k=1的时候->f(x%p)=f(x) % p;
因为x和f(x)都是0..p-1所以
=>f(x)=f(x)
可知f(0..p-1)都没有限制,则每个值都可以任意取
则方案是
p^p
③
当k>=2的时候;
先考虑x=0的时候
f(0)=k*f(0)
则f(0)*(k-1)=0·········(k>=2)
则可知f(0)==0
所以当k>=2的时候f(0)也是固定的;
接下来考虑当x>=1的时候
先假设r是满足(k^r)%p==1的最小正数
而f(x)<=p-1
则有
f(x) = k^r*f(x)%p
=k^(r-1)*f(k*x%p) % p
=k^(r-2)*f(k^2*x%p)%p
=…
=k^(r-(r-1))*f(k^(r-1)*x%p)%p
根据同余率
f(x) = k^r*f(x)%p
=k^(r-1)% p*f(k*x%p) % p
=k^(r-2)% p*f(k^2*x%p)%p
=…
=k^(r-(r-1))% p*f(k^(r-1)*x%p)%p
上面的r个等号
左边的k^b%r
都是常数
而
f(x)<=p-1
则可知
如果f(x)
确定之后
以下这r-1个函数值
f(k*x%p)
f(k^2*x%p)
…
f(k^(r-1)*x%p)
也确定了(不一定相同);
又r是满足k^r%p==1的最小正数
可知k^1 %p,k^2%p..k^(r-1)%p这些值都是不同的;
(k^1 %p..k^(r-1)%p这些值都不可能为0)
(因为到了r才第一次出现循环节,因为k^0==1,而k^0%p==1);
也就是说我们一旦确定了一个f(x)之后,就会有另外r-1个x对应的函数值也确定了;
加上自己一共有r个;
则供我们选择的f(x)有(p-1)/r个函数值(f(0)已经确定了所以是p-1);
一旦这p-1/r个函数值f(x)确定了,1..p-1的函数值也就确定了;
而我们选择的(p-1)/r个函数值总共有p个值可以选
则答案就是
p^((p-1)/r);
因为由费马小定理
可知
k^(p-1) % p==1
而
k^r % p==1
所以r肯定能整除p-1;
因此(p-1)/r是个整数
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const LL MOD = 1e9+7;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
int num;
LL p,k;
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rel(p);rel(k);
if (k==0)
num = p-1;
else
if (k==1)
num = p;
else
{
int r=1;
int now = (1*k)%p;
while (now!=1)
{
now = (now*k)%p;
r++;
}
num = (p-1)/r;
}
LL ans = 1;
rep1(i,1,num)
ans = (ans * p)%MOD;
cout << ans << endl;
return 0;
}
【codeforces 604D】Moodular Arithmetic的更多相关文章
- 【Codeforces 115D】Unambiguous Arithmetic Expression
Codeforces 115 D 题意:给一个没有括号的表达式,问有多少种添加括号的方法使得这是一个合法的表达式?输入可能有正负号.加减乘除.数字. 思路1: 这是不能过的\(naive\)的\(dp ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【51.27%】【codeforces 604A】Uncowed Forces
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
- 【codeforces 709D】Recover the String
[题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...
- 【codeforces 709B】Checkpoints
[题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...
- 【codeforces 709C】Letters Cyclic Shift
[题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
随机推荐
- 5.9 enum--支持枚举类型
enum模块提供了枚举类型的支持.枚举类型是由一个名称和一个统一值来组成.值是常量的值.它们之间能够通过名称进行比較和引用,还能够迭代訪问. 5.9.1 模块内容 本模块主要定义了两种枚举类型:Enu ...
- 用实力让情怀落地!阅兵前线指挥车同款电视TCL H8800受捧
近期.一则重磅消息刷爆了平面媒体.微博.朋友圈等各个传播渠道:TCL曲面电视H8800正式入驻大阅兵前线指挥车以及国旗护卫队荣誉室.宣告代表眼下中国彩电业最高技术水准的曲面电视,正式走上大阅兵 ...
- 《ASP.NET》数据绑定—DropDownList、ListBox
DropDownList和ListBox实现两级联动功能.他们也能够将从后台数据库中搜选的出来的信息加以绑定.这里要实现的功能是在DropDownList中选择"省",然后让Lis ...
- 84.setlocale
用法示例 #include <Windows.h> #include <stdio.h> #include<locale.h> void main() { //se ...
- Flume Source官网剖析(博主推荐)
不多说,直接上干货! 一切来源于flume官网 http://flume.apache.org/FlumeUserGuide.html Flume Sources Avro Source Thrift ...
- 15、python学习手册之:元组、文件及其他
1.使用文本来存储python对象时,必须使用转换工具把对象转成字符串 2.内置函数eval可以把字符串当做可执行程序代码:eg s = ‘[1,2,3]’ eval(s) -->[1, ...
- 【 Codeforces Round #430 (Div. 2) A 】 Kirill And The Game
[链接]点击打开链接 [题意] 水题 [题解] 枚举b从x..y看看k*i是不是在l..r之间就好. [错的次数] 0 [反思] 在这了写反思 [代码] #include <cstdio> ...
- 配置PL/SQL Developer连接server数据库
配置PL/SQL Developer连接server数据库 远程应用server上安装client客户端软件,可在oracle官网上下载. 举例: 环境 应用server操作系统 WIN 7 本地地址 ...
- PHP与Linux进程间的通信
进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业).当然非常多公司考的是算法. 不查阅资料,我脑子里能想到的 [1] 管道, (有名.无名) [2] 父子进程 [3] System V (消息队 ...
- es6三点运算符的用法
扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1,2,3]); console.log(1,. ...