codeforces #334 div1 B 603B Moodular Arithmetic(数论)

题目链接:

codeforce 603B


题目大意:

给出f(kx mod p)≡kf(x) mod p,求满足条件的f(x)的数量。


题目分析:

首先考虑两种特殊情况,即k=0和k=1的情况。

  • 当k = 0 时,

    {f(x)=0f(x)={0,?p?1},x=0,x>0

    因为k=0?f(kx mod p)≡f(0),x<p

    所以只有f(0)必须等于0,其他的f(x)可以为任意值域中的值,所以方案数是pp?1

  • 当k=1时,

    f(x mod p)=f(x) mod p,x<p?x mod p=x,所以f(x),0≤x<p,f(x)可以为值域内任意值,所以方案数为pp

  • 当k>1时,
    • 我们令f(x) = n,那么会导致f(kx),f(k1x)?f(kmx)的值会被确定,而且会形成循环节,我们可以利用km≡1 mod p求得循环节的长度。
    • 因为在0到m-1中kimod p的值不同,那么他们乘上一个常数n之后也一定是不同的。
    • 然后我们可以通过p?1m知道这p-1个数一共存在多少个这种封闭的群,每个群只需要确定一个值,就确定了其他所有的值,所有说最后的方案数就是p?p?1m?

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long LL;
int k,p;
const LL mod = 1e9+7;

LL pow1 ( LL x , LL n )
{
    LL ret = 1;
    LL num = x;
    while ( n )
    {
        if ( n&1 )
        {
            ret *= num;
            ret %= mod;
        }
        num *= num;
        num %= mod;
        n >>= 1;
    }
    return ret;
}

int main ( )
{
    while ( ~scanf ( "%d%d" , &p , &k ) )
    {
        int m = 1;
        LL temp = k;
        if ( k == 0 )
        {
            printf ( "%lld\n" , pow1 ( p , p-1 ) );
            continue;
        }
        if ( k == 1 )
        {
            printf ( "%lld\n" , pow1 ( p , p ) );
            continue;
        }
        for ( ; m < p  ; m++ )
        {
            if ( temp == 1 ) break;
            temp *= k;
            temp %= p;
        }
        int x = ceil((p-1)*1.0/m);
        printf ( "%lld\n" , pow1 ( p , x ) );
    }
}
时间: 2024-08-01 00:44:50

codeforces #334 div1 B 603B Moodular Arithmetic(数论)的相关文章

codeforces #334 div1 603C Lieges of Legendre(博弈)

题目链接: codeforces 603C 题目大意: 有两个人做游戏,游戏规则如下: 有n堆石子,每次可以对一堆石子进行操作,如果当前石子是偶数,那么可以选择将这2*x个石子分成k堆石子数为x的石子堆,还有一种没有前提的操作是取走当前堆的一个石子,问先手赢还是后手赢,先手和后手都足够聪明的情况下. 题目分析: 首先对于这种组合游戏的题目,很容易想到利用SG函数来解.我们对于游戏的局势进行分类讨论: 当k是偶数的情况下, 我们可以知道如果要把一个偶数堆分成k个堆,相当于将局势转到一个新的组合游戏

codeforces 55D D. Beautiful numbers(数位dp+数论)

题目链接: codeforces 55D 题目大意: 求在[l,r]中能够整除自己每个数位上的数字的数的个数. 题目分析: 首先我们能够知道如果这个数能够整除它的每个数位上的数字,那么它一定能够整除他们的最小公倍数,是充要的. 那么我们定义状态dp[i][j][k]代表i位在任意组合下得到的所有数位的数字的最小公倍数为j的每个数位上的数字之积%2520为k的方案数. 我们可以知道所有的公倍数最大不会超过2520,而且他们都是2520的约数,所以如果他们能够整除2520的余数,那么证明他们能够整除

codeforces #305 div1 done

总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目,每道题目还是都要写题解的 (我这算不算立flag? 本蒟蒻写的题解的链接: A:http://www.cnblogs.com/joyouth/p/5352953.html B:http://www.cnblogs.com/joyouth/p/5352932.html C:http://www.cn

【Codeforces Round 650】Codeforces #334 (Div. 1)

模拟CF650,ABC三题,RK90 Codeforces 650 A 思路:首先看式子 \(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}=|x_i-x_j|+|y_i-y_j|\) 的唯一可行的情况是\(x_i=x_j\)或\(y_i=y_j\).(因为两边之和大于第三边 所以就知道怎么做了. 第一种方法:我们维护三个\(map\),分别存行.列.坐标是\(\dots\)的时候已经有多少个节点. 然后就可以边读边算,读到\((x,y)\)这个坐标的时候把\(ans\)变成 \(

Codeforces #594 div1 C/div2 E – Queue in the Train

题目链接:https://codeforces.com/contest/1239/problem/C 题意:火车上有n位乘客,按照1到n编号,编号为i的人会在ti分钟想去打水.水箱只能供一位乘客使用,每位乘客会使用p分钟.当一位乘客想要去打水时,他会先看编号在他前面的乘客是不是都在座位上,如果有人没在座位上,他会坐下继续等待,否则他会去排队打水.当某一时刻有几位乘客同时想要打水时,编号最小的乘客会前去打水,其他人会坐下继续等待,计算每位乘客打完水的时间. 做法:模拟.按照题意模拟即可,具体实现见

codeforces#426(div1) B - The Bakery (线段树 + dp)

题意:把 n 个数划分成 m 段,要求每组数不相等的数的数量最大之和. 思路: dp方程 : dp[i][j] = max( dp[k][j-1] + v(k, i) );( j<=k<i , k = j, j+1, +...+ i-1) dp[i][j]表示第 i 个数分到第 j 段的最大值. v(k, i) 表示k~i中不同数的个数,此处用hash记录每个数上一次出现的位置,从上一次出现的位置到当前位置的 dp[i][j-1] 值均可+1. 此时时间复杂度 O(n*m*log(n)). 线

codeforces #313 div1 D

好神的题目! 首先我们运用pick定理A=S-B/2+1将要求的东西转化掉 之后分离变量,我们变成了求选取凸包面积的期望和求选取凸包在边界上的点的期望 我们先考虑求选取凸包面积的期望 如何计算凸多边形的面积,我们可以原点为划分点,计算凸包上的每个向量的叉积的和 如何计算凸包边界上的点,我们可以计算凸包上的每个向量上的点 那么我们可以考虑每个向量被计算的概率 显然p(i)-p(i+k)这个向量被计算的概率为(2^(n-k-1)-1)/(2^n-1-n-n*(n-1)/2)次 这样我们就可以O(n^

codeforces #310 div1 E

算得上是比较水的E题了吧,自己想了想写了写居然1A了 对于这道题,我们很容易想到对于原图的一个边双,定向后任意两点间一定可达 那么我们可以求出原图的边双并将每个边双缩成一个点 那么原图就变成了无环的无向图,也就是一片森林 之后我们考虑每个任务: 1.如果S和T处于一个边双里,显然是可行的 2.如果S和T处于两棵树中,显然不连通不可行 3.S和T处于一棵树中,那么S->lca的所有边都是向上的,lca->T的所有边的都是向下的 对于第三种情况,我们可以在S上打一个up标记,在T上打一个down标

【codeforces #275(div1)】AB题解

A. Diverse Permutation time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Permutation p is an ordered set of integers p1,???p2,???...,???pn, consisting of n distinct positive integers not larg