zoukankan      html  css  js  c++  java
  • bzoj 2186 [Sdoi2008]沙拉公主的困惑

    我们根据欧几里得定理可以知道

    (a,b)=(b,a mod b)也可以得到

    (a+b,b)=(b,(a+b) mod b)=(b,a)=(a,b)

    直观点说就是两个数a,b的gcd,和a+b,b的gcd是相等的

    那么我们可以知道phi(m!)也就是与1-m!中与m!互质的数,

    那么对于每个互质的数,我们加上m!,就可以得到一个新的

    和m!互质的数,所以对于每个1-m!与m!互质的数

    n!范围内一共可以得到n!/m!组解,那么一共也就是phi(m!)*(n!/m!)

    可以将phi(m!)用公式展开化简,在此不再赘述

    /**************************************************************
        Problem: 2186
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:9524 ms
        Memory:248272 kb
    ****************************************************************/
     
    //By BLADEVIL
    var
        t, r                        :longint;
        i                           :longint;
        prime                       :array[0..1000001] of longint;
        flag                        :array[0..10000001] of boolean;
        fac, pi1, pi2               :array[0..10000001] of int64;
        x, y                        :int64;
         
    procedure make;
    var
        i, j                        :longint;
    begin
        fac[0]:=1;
        flag[1]:=true;
        for i:=1 to 10000000 do fac[i]:=fac[i-1]*int64(i) mod r;
        for i:=2 to 10000000 do
        begin
            if not flag[i] then
            begin
                inc(prime[0]);
                prime[prime[0]]:=i;
            end;
            for j:=1 to prime[0] do
            begin
                if i*prime[j]>10000000 then break;
                flag[i*prime[j]]:=true;
                if i mod prime[j]=0 then break;
            end;
        end;
        pi1[0]:=1; pi2[0]:=1;
        for i:=1 to 10000000 do
        begin
            pi1[i]:=pi1[i-1];
            if not flag[i] then pi1[i]:=pi1[i]*int64(i-1) mod r; 
        end;
        for i:=1 to 10000000 do
        begin
            pi2[i]:=pi2[i-1];
            if not flag[i] then pi2[i]:=pi2[i]*int64(i) mod r; 
        end;
    end;
     
    procedure ex_gcd(a,b:int64);
    var
        z                           :int64;
    begin
        if b=0 then
        begin
            x:=1; y:=0; exit;
        end;
        ex_gcd(b,a mod b);
        z:=x;
        x:=y;
        y:=z-(a div b)*y;
    end;
         
    function gcd(a:int64):int64;
    begin
        ex_gcd(a,r);
        gcd:=(x mod r+r) mod r;
    end;
         
    procedure main;
    var
        i                           :longint;
        ans                         :int64;
        n, m                        :longint;
    begin
        read(n,m);
        ans:=fac[n];
        ans:=ans*pi1[m] mod r;
        ans:=ans*gcd(pi2[m]) mod r;
        writeln(ans);
    end;
     
    begin
        read(t,r);
        make;
        for i:=1 to t do main;
    end.
     
  • 相关阅读:
    单位表示
    linux 文件权限
    php中高级基础知识点
    CodeIgniter配置之SESSION
    提高PHP开发质量的36个方法(精品)
    数据库优化举例详解
    ajax 跨域解决 网上资料
    static(静态)关键字
    假如java类里的成员变量是自身的对象
    Java 静态代码块&构造代码块&局部代码块
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3490321.html
Copyright © 2011-2022 走看看