首先假设输入的是n,m

我们就是要求m^(Σ(c(n,i) i|n)) mod p

那么根据费马小定理,上式等于

m^(Σ(c(n,i) i|n) mod  (p-1)) mod p

那么问题的关键就是求 Σ(c(n,i) i|n) mod  (p-1)了

那么如果P是素数的话,我们可以用lucas定理来快速求出来组合数,这道题的p-1是

非素数,那么我们分解质因数pi,假设c(n,i) i|n为X,那我们求出来X mod pi=ai,这个是

符合lucas定理的,那么我们可以得到质因子数个式子(本题有4个质因子),然后我们用

中国剩余定理合并这4个式子就行了

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
const
    d39                     =;
    pp                      :array[..] of longint=(,,,);
     
var
    n, m, k                 :int64;
    cc                      :int64;
    a                       :array[..] of int64;
    i                       :longint;
    fac                     :array[..] of int64;
     
function ex_gcd(a,b:int64):int64;
var
    z                       :int64;
begin
    if b= then
    begin
        ex_gcd:=;
        cc:=;
        exit;
    end else
    begin
        z:=ex_gcd(b,a mod b);
        ex_gcd:=cc;
        cc:=z-(a div b)*cc;
    end;
end;   
 
function gcd(a,p:int64):int64;
begin
    gcd:=ex_gcd(a,p);
    gcd:=(gcd mod p+p) mod p;
end;
     
function combine(a,b,p:int64):int64;
var
    ans1, ans2              :int64;
    i                       :longint;
begin
    ans1:=fac[a] mod p;
    ans2:=(fac[a-b]*fac[b]) mod p;
    ans2:=gcd(ans2,p);
    combine:=ans1*ans2 mod p;
end;
     
function lucas(x,y,p:int64):int64;
var
    a, b                    :int64;
begin
    if y= then exit();
    a:=x mod p;
    b:=y mod p;
    if a<b then exit() else lucas:=lucas(x div p,y div p,p)*combine(a,b,p);
end;   
 
function crt:int64;
var
    i                       :longint;
begin
    crt:=;
    for i:= to do
        crt:=(crt+a[i]*((d39-) div pp[i])*gcd((d39-) div pp[i],pp[i])) mod (d39-);
end;
 
function get(x:int64):int64;
var
    i, j                    :longint;
begin
        for i:= to trunc(sqrt(x)) do
        begin
            if x mod i= then
            begin
                for j:= to do
                begin
                    a[j]:=(a[j]+lucas(x,i,pp[j])) mod pp[j];
                    if x div i<>i then a[j]:=(a[j]+lucas(x,x div i,pp[j])) mod pp[j];
                end;
            end;
        end;
    get:=crt;
end;
 
function mi(n,k,p:int64):int64;
var
    sum                     :int64;
begin
    mi:=;
    sum:=n;
    while k<> do
    begin
        if k mod = then mi:=mi*sum mod p;
        sum:=sum*sum mod p;
        k:=k div ;
    end;
end;
 
begin
    fac[]:=;
    for i:= to pp[] do fac[i]:=fac[i-]*int64(i) mod (d39-);
    read(n,m);
    if m mod d39= then
    begin
        writeln();
        halt;
    end;
    k:=get(n);
    writeln(mi(m,k,d39));
end.

bzoj 1951 lucas crt 费马小定理的更多相关文章

  1. BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)

    题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...

  2. [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  3. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  4. [CodeVs1515]跳(lucas定理+费马小定理)

    嘿嘿嘿好久没写数学题了,偶尔看到一道写一写... 题目大意:一个(n+1)*(m+1)[0<=n, m<=10^12,n*m<=10^12]的矩阵,C(0,0)=1,C(x,y)=C ...

  5. 【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理

    题目描述 求  $g^{\sum\limits_{k|n}C_{n}^{\frac nk}}\mod 999911659$ 输入 有且仅有一行:两个数N.G,用一个空格分开. 输出 有且仅有一行:一个 ...

  6. hdu 3037 费马小定理+逆元除法取模+Lucas定理

    组合数学推推推最后,推得要求C(n+m,m)%p 其中n,m小于10^9,p小于1^5 用Lucas定理求(Lucas定理求nm较大时的组合数) 因为p数据较小可以直接阶乘打表求逆元 求逆元时,由费马 ...

  7. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  8. 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...

  9. BZOJ 3240 [Noi2013]矩阵游戏 ——费马小定理 快速幂

    发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...

随机推荐

  1. css匹配规则及性能

    一.CSS是如何匹配样式的 样式系统从最右边的选择符开始向左进行匹配规则.只要当前选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和规则匹配的元素,或者因为不匹配而退出. 二.CSS选择 ...

  2. Vm-Ubuntu下配置Qt开发环境

    在昨天的Ubuntu换降下,安装Qt发现编译的时候是缺少opengl的 奈何找了好多方式都无法安装opengl 今天看到另一位大神写的,才发下自己找的还是有问题 大神帖子网址:http://blog. ...

  3. 局部敏感哈希LSH

    之前介绍了Annoy,Annoy是一种高维空间寻找近似最近邻的算法(ANN)的一种,接下来再讨论一种ANN算法,LSH局部敏感哈希. LSH的基本思想是: 原始空间中相邻的数据点通过映射或投影变换后, ...

  4. WebSocket 与 HTTP/2

    个人笔记 WebSocket WebSocket 是一个双向通信协议,它在握手阶段采用 HTTP/1.1 协议(暂时不支持 HTTP/2). 握手过程如下: 首先客户端向服务端发起一个特殊的 HTTP ...

  5. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  6. java第七笔记

  7. AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.

    体验最新版AndroidStudio3.0 Canary 8的时候,发现之前项目的butter knife报错,用到注解的应该都会报错 Error:Execution failed for task ...

  8. [剑指Offer] 34.第一个只出现一次的数

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置 [思路]当一个字符第一次出现的位置和它最后一次出现的位置相同,那么 ...

  9. OSCache页面缓存的使用

    完成项目时,为了减少对数据库的频繁操作,引出了缓存,缓存分为以下几种: 1.一级缓存 一级缓存的存储域是session,作用于单个的dao 2.二级缓存 二级缓存的存储域是sessionFactory ...

  10. Shiro 的 HelloWorld

    密码文件 [users] zhang=123 wang=123 测试 package org.zln.hello; import org.apache.log4j.LogManager; import ...