HDU4675 GCD of Sequence(預處理階乘逆元+推公式)
題目連結:傳送門
題意:
給定一個長度為n的序列a,且 1<=a[i]<=m,求有多少個序列b,使得GCD(b[1],b[2],...b[n])=x (1<=x<=m),且
正好有k個b[i]!=a[i].
分析:
設F[d]表示 gcd = d的滿足條件的序列的個數,G[d]表示滿足條件的gcd = k*d (1<=k)的序列的個數。那麼很明顯 F[d] = G[d] - F[2*d] -F[3*d]...
在做的時候我們先求G[d]我們列舉gcd,在原來的序列中找到gcd倍數的個數,設為tot.因為題目要求恰好與k個不同而且,gcd = d,那麼新的序列肯定都得是d的倍數,原序列中不是d的倍數的個數為 n-tot.這些數十肯定需要修改的,如果
1)n-tot>k那麼肯定是不可能的了。
2)n-tot<=k 那麼這n-tot個數要換成d的倍數,每個數有m/d種,所有的就是 (m/d)^(n-tot),剩下的tot個數中還要選出k-(n-tot)個數變成不等於他們自己本身的d的倍數,每個數有(m/d-1)種,那麼這種情況有
C(tot,k-(n-tot))*(m/d-1)^(k-(n-tot))種。G[d]=(m/d)^(n-tot)*C(tot,k-(n-tot))*(m/d-1)^(k-(n-tot))%mod
在求組合數的時候我們要先預處理一下階乘的逆元。因為資料量比較大我們需要用遞推法來預處理逆元
inv[n] = inv[mod%n]*(mod-mod/n)%mod;具體的證明:傳送門
程式碼如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
const int maxn = 3e5+10;
LL ans[maxn];
LL cnt[maxn];
LL inv[maxn];
LL fac[maxn];
LL get_inv(LL n){
if(n==1) return 1;
return get_inv(mod%n)*(mod-mod/n)%mod;
}
LL Com(LL n,LL m){
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void init(){
inv[0]=fac[0]=1;
for(int i=1;i<maxn;i++){
fac[i]=fac[i-1]*i%mod;
inv[i]=get_inv(fac[i]);
}
}
LL quick_mod(LL a,LL b){
LL ans = 1;
while(b){
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main(){
init();
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
cnt[x]++;
}
for(int i=m;i>=1;i--){
LL tot = 0;
for(int j=i;j<=m;j+=i) tot+=cnt[j];
if(n-tot>k){
ans[i]=0;
continue;
}
ans[i]=quick_mod(m/i,n-tot)*quick_mod(m/i-1,k-(n-tot))%mod;
ans[i]=ans[i]*Com(tot,k-(n-tot))%mod;
for(int j=i+i;j<=m;j+=i)
ans[i]=(ans[i]-ans[j]+mod)%mod;
}
for(int i=1;i<m;i++)
printf("%I64d ",ans[i]);
printf("%I64d\n",ans[m]);
}
return 0;
}
相關文章
- HDU3944 DP? (LUCAS定理+階乘預處理)
- ACdream1139 Sum(推公式+逆元求解)公式
- 關於GCD多工處理GC
- 電影推薦系統資料預處理
- 關於sequence問題的緊急處理
- 影像預處理
- 預處理指令
- 預處理命令
- Keras版Sequence2Sequence對對聯實戰——自然語言處理技術Keras自然語言處理
- 資料預處理
- 影像預處理方法
- 計算階乘
- ACM 階乘之和ACM
- Linux下編輯處理數理化公式(轉)Linux公式
- 資料預處理 demo
- c++進階(一)C語言條件編譯及編譯預處理階段C++C語言編譯
- maatwebsite/excel3.1 匯入excel 公式怎麼處理WebExcel公式
- 【scikit-learn基礎】--『預處理』之 缺失值處理
- 逆元學習
- nlp 中文資料預處理
- 機器學習一:資料預處理機器學習
- 文字檢測預處理地址
- 程式環境和預處理
- 影像預處理包括哪些東東?
- split用法與影像預處理
- 特徵工程之特徵預處理特徵工程
- 資料預處理規則
- 資料預處理的形式
- 預處理技術文獻
- 統一場理論公式推導和筆記——part5公式筆記
- 統一場理論公式推導和筆記——part6公式筆記
- 異常處理與推導式
- 第五篇:資料預處理(二) - 異常值處理
- 第四篇:資料預處理(一) - 缺失值處理
- SPM12之fMRI批次預處理——NII檔案處理
- Java進階02 異常處理Java
- SQL SERVER 求階乘之和SQLServer
- 面試題:階乘問題面試題