[武漢集訓] Cliquers

来源:https://www.cnblogs.com/nosta/archive/2019/03/03/10467900.html
-Advertisement-
Play Games

題意 設把$n$個不同元素分成若幹個大小相等的集合的方案個數為$res$,求$m^{res}$模$10^9 401$後的餘數。 (n,m不超過2\ 10^9) 分析 可以知道,所求答案為$m^r \bmod P$其中$r=\sum_{d\mid n} \dfrac{n!}{\frac{n}{m}!^ ...


題意

設把\(n\)個不同元素分成若幹個大小相等的集合的方案個數為\(res\),求\(m^{res}\)\(10^9-401\)後的餘數。 (n,m不超過2*10^9)

分析

可以知道,所求答案為\(m^r \bmod P\)其中\(r=\sum_{d\mid n} \dfrac{n!}{\frac{n}{m}!^dd!} \bmod (P-1)\)
考場時的想法:我們可以寫暴力!預處理階乘,把階乘中與\(P-1\)相關的因數單獨搞

代碼實現

#include <bits/stdc++.h>
#pragma GCC optimize("2")
#define LL long long
using namespace std;

const int N=1e7+10;
const int P=1e9-401;
const int P1=2,P2=13,P3=5281,P4=7283; //P-1=P1*P2*P3*P4

struct node {
    int p,a1,a2,a3,a4;
} f[N];

inline int fpow(int x,int y) {
    register int c=1;
    for(; y; y>>=1,x=1LL*x*x%(P-1))
        if(y&1) c=1LL*c*x%(P-1);
    return c;
}
inline void exgcd(int a,int b,int&x,int&y,int&d) {
    if(!b) d=a,x=1,y=0;
    else exgcd(b,a%b,y,x,d),y-=a/b*x;
}
inline int inv(int c) {
    static int x,y,d;
    exgcd(c,P-1,x,y,d);
    assert(d==1);
    y=(P-1)/d;
    x=(x%y+y)%y;
    return x;
}
inline int get(int n,int d) {
    return 1LL*f[n].p
    *inv(1LL*fpow(f[n/d].p,d)*f[d].p%(P-1))%(P-1)
    *fpow(P1,f[n].a1-d*(f[n/d].a1)-f[d].a1)%(P-1)
    *fpow(P2,f[n].a2-d*(f[n/d].a2)-f[d].a2)%(P-1)
    *fpow(P3,f[n].a3-d*(f[n/d].a3)-f[d].a3)%(P-1)
    *fpow(P4,f[n].a4-d*(f[n/d].a4)-f[d].a4)%(P-1);
}
inline int ind(int n) {
    int c=0;
    for(int d=1; d<=n/d; ++d) {
        if(n%d!=0) continue;
        c=(c+get(n,d))%(P-1);
        if(n/d!=d) c=(c+get(n,n/d))%(P-1);
    }
    return c;
}

int main() {
    freopen("c://users/hsy/desktop/cliquers/cliquers3.in","r",stdin);
//  freopen("c://users/hsy/desktop/cliquers.out","w",stdout);
    
    f[0].p=1;
    for(int i=1; i<N; ++i) {
        f[i]=f[i-1];
        long long x=i;
        while(x%P1==0) x/=P1,f[i].a1++;
        while(x%P2==0) x/=P2,f[i].a2++;
        while(x%P3==0) x/=P3,f[i].a3++;
        while(x%P4==0) x/=P4,f[i].a4++;
        f[i].p=x*f[i].p%(P-1);
    }
    int T,n,m,ans;
    scanf("%d",&T);
    while(T--) {
        ans=1; scanf("%d%d",&n,&m);
        for(int x=m,y=ind(n); y; y>>=1,x=1LL*x*x%P) 
            if(y&1) ans=1LL*ans*x%P;
        printf("%d\n",ans);
    }
    return 0;
}

然後聯想到擴展盧卡斯,(其實是考完後聽到某AK大牛談到的),剛好適用於處理階乘間的運算處理,於是改改就是道模板題了。

代碼實現

#include <bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
using namespace std;

struct ex_lucas {
    void gcd(LL a,LL b,LL&x,LL&y) {
        if(b==0) x=1, y=0;
        else gcd(b,a%b,y,x),y-=a/b*x;
    }
    LL inv(LL a,LL b) {
        static LL x,y;
        gcd(a,b,x,y);
        return (x%b+b)%b;
    }
    LL pow(LL a,LL b,LL p) {
        LL c=1;
        for(; b; b>>=1,a=a*a%p)
            if(b&1) c=c*a%p;
        return c;
    }
    LL fac(LL n,LL pi,LL pm) {
        if(n==0) return 1;
        LL c=1;
        for(LL i=2; i<=pm; ++i)
            if(i%pi) c=c*i%pm;
        c=pow(c,n/pm,pm);
        for(LL i=2; i<=n%pm; ++i)
            if(i%pi) c=c*i%pm;
        return c*fac(n/pi,pi,pm)%pm;
    }
    LL par(LL n,LL m,LL p,LL pi,LL pm) {
        LL a=fac(n,pi,pm);
        LL b=inv(fac(m,pi,pm),pm);
        LL c=inv(pow(fac(n/m,pi,pm),m,pm),pm);
        LL k=0, d=0;
        for(LL i=n; i;) k+=(i/=pi);
        for(LL i=m; i;) k-=(i/=pi);
        for(LL i=n/m; i;) k-=(i/=pi)*m;
        d=a*b%pm*c%pm*pow(pi,k,pm)%pm;
        return d*(p/pm)%p*inv(p/pm,pm)%p;
    }
    LL ind(LL n,LL m,LL p) { //可以再簡化。。畢竟P-1固定。。
        LL c=0, x=p, pm;
        for(LL i=2; x!=1 && i*i<=p; ++i) {
            if(x%i==0) {
                for(pm=1; x%i==0;) pm*=i, x/=i;
                c=(c+par(n,m,p,i,pm))%p;
            }
        }
        if(x>1) c=(c+par(n,m,p,x,x))%p;
        return c;
    }
} System;

const int P=1e9-401;

int main() {
//  freopen("c://users/hsy/desktop/cliquers/cliquers.in","r",stdin);
//  freopen("c://users/hsy/desktop/cliquers.out","w",stdout);
    int T,n,m;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&n,&m);
        int x=m,y=0,ans=1;
        for(int d=1; d<=n/d; ++d) {
            if(n%d!=0) continue;
            y=(y+System.ind(n,d,P-1))%(P-1);
            if(d!=n/d) y=(y+System.ind(n,n/d,P-1))%(P-1);
        } 
        for(; y; y>>=1,x=1LL*x*x%P)
            if(y&1) ans=1LL*ans*x%P;
        printf("%d\n",ans);
    }
    return 0;
    
}

後記

考場上分解質因數出鍋了,只搞到了前3個質數,然後愉快爆0。(草,中日雙語)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,學習背景 1. 前言 對於我們不管工作還是生活中,需要或者想去學習一些東西的時候,大致都考慮幾點: a) 我們為什麼需要學習這個東西? b) 這個東西是什麼? c) 這個東西能為我們做什麼? d) 如何去學? 結合以上幾點,我們一起學習下Dubbo這個框架! 2. 學習背景 互聯網的發展,網站應 ...
  • 這小節的題目看起來還挺晦澀的, crosstab 是 pandas 的一個函數, 作用還蠻強大的, 一起來看一下吧~~~ 首先還是先引入一個例子文件: 輸出:好, 下麵看一下 crosstab 的功力: 輸出:crosstab 第一個參數是列, 第二個參數是行. 還可以添加第三個參數: 輸出: 同時 ...
  • 首先是一個views函數的例子 def get_user_profiles(request): if request.method == 'POST': myFile = request.FILES.get("filename", None) if myFile: dir = os.path.joi ...
  • 學號 20175223 《Java程式設計》第1周學習總結 教材學習內容總結 第一章要點: 要點1:Java的三大平臺:Java SE,Java EE,Java ME。 要點2:Java的特點:簡單,面向對象,平臺無關,多線程,動態。 要點3:Java程式的開發步驟:編寫源文件,編譯源文件,運行程式 ...
  • 1、 "官網" 下載 2、把下載的文檔解壓,放到合適的路徑下。 3、打開eclipse 4、在Apache文件夾下選擇Tomcat的對應版本 5、選擇剛纔下載的文件 6、可以右鍵Start了 ...
  • 今日興趣新聞: NASA 研製最強推進器,加速度可達每秒 40 公裡,飛火星全靠它 鏈接:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B"nid"%3A"news_11707429683828231737"%7D&n_type ...
  • 新聞 "對於F ,Visual Studio 2019 RC有哪些更新" "Visual Studio 2019 RC現在已經發佈" "C 版本與工具的升級" "如何移植桌面應用程式到.NET Core 3.0" "對於Xamarin開發者,在Visual Studio 2019預覽版2中有哪些更新 ...
  • 1. 創建項目 1.1 新建項目 首先新建一個項目,名為 mysite,命令如下: 運行成功,生成一些目錄: 1.2 啟動伺服器 執行成功,看到輸出如下信息: 在瀏覽器中訪問 ,看到以下信息,表示開啟成功(Django2.x 以下版本不一樣): 1.3 新建應用 現在我們新建一個應用(app),名為 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...