zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    win7+Apache 设置域名指向本地文件夹
    JavaScript 函数式编程
    JS防抖动
    13 个最佳 JavaScript 数据网格库
    js笔试-接收get请求参数
    这10道javascript笔试题你都会么
    60行JavaScript代码俄罗斯方块
    先少谈点人工智能好吗?
    gulp+webpack构建配置
    Gulp和webpack的区别,是一种工具吗?
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626756.html
Copyright © 2011-2022 走看看