国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[bzoj4305]數列的gcd

2019-11-08 18:39:43
字體:
來源:轉載
供稿:網友

題目描述

給出一個長度為N的數列{a[n]},1<=a[i]<=M(1<=i<=N)。 現在問題是,對于1到M的每個整數d,有多少個不同的數列b[1], b[2], …, b[N],滿足: (1)1<=b[i]<=M(1<=i<=N); (2)gcd(b[1], b[2], …, b[N])=d; (3)恰好有K個位置i使得a[i]<>bi 注:gcd(x1,x2,…,xn)為x1, x2, …, xn的最大公約數。 輸出答案對1,000,000,007取模的值。

瞎做

我設f[i]表示d=i的答案 用一個g[i]表示所有i|d的d的答案和。 然后莫比烏斯反演一波。 所以我們只需要算g。 可以通過預處理求出不是d的倍數有t個。 那么這個t個一定不和原來相同 剩下n-t個中要有k-t個和原來相同 就是一個組合數咯

#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;typedef long long ll;const int maxn=300000+10,mo=1000000007;int mu[maxn],cnt[maxn],b[maxn],PRi[maxn],f[maxn],g[maxn],fac[maxn],inv[maxn],a[maxn];bool bz[maxn];int i,j,k,l,t,n,m,top;int quicksortmi(int x,int y){ if (!y) return 1; int t=quicksortmi(x,y/2); t=(ll)t*t%mo; if (y%2) t=(ll)t*x%mo; return t;}int C(int n,int m){ if (n<m||n<0||m<0) return 0; return (ll)fac[n]*inv[m]%mo*inv[n-m]%mo;}int main(){ scanf("%d%d%d",&n,&m,&k); fo(i,1,n){ scanf("%d",&a[i]); b[a[i]]++; } fo(i,1,m) fo(j,1,m/i) cnt[i]+=b[i*j]; fac[0]=1; fo(i,1,n) fac[i]=(ll)fac[i-1]*i%mo; inv[n]=quicksortmi(fac[n],mo-2); fd(i,n-1,0) inv[i]=(ll)inv[i+1]*(i+1)%mo; top=0; mu[1]=1; fo(i,2,m){ if (!bz[i]){ pri[++top]=i; mu[i]=-1; } fo(j,1,top){ if ((ll)i*pri[j]>m) break; bz[i*pri[j]]=1; if (i%pri[j]==0){ mu[i*pri[j]]=0; break; } mu[i*pri[j]]=-mu[i]; } } fo(i,1,m){ t=n-cnt[i]; if (k<t) continue; g[i]=(ll)C(n-t,k-t)*quicksortmi(m/i-1,k-t)%mo*quicksortmi(m/i,t)%mo; } fo(i,1,m){ fo(j,1,m/i) f[i]=(f[i]+g[i*j]*mu[j])%mo; (f[i]+=mo)%=mo; printf("%d%c",f[i],i==m?'/n':' '); }}
上一篇:highchart柱狀圖

下一篇:linux下jdk安裝

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇远县| 三亚市| 镇原县| 探索| 赤城县| 盘锦市| 五大连池市| 射洪县| 明溪县| 泸西县| 游戏| 奉贤区| 响水县| 黑龙江省| 孟州市| 浦东新区| 阿拉尔市| 渑池县| 林西县| 印江| 城口县| 凌海市| 桃园县| 昌邑市| 梁河县| 文安县| 万州区| 哈巴河县| 哈尔滨市| 措勤县| 大城县| 邢台市| 梧州市| 广河县| 赣榆县| 米易县| 东丰县| 唐河县| 祁东县| 施秉县| 南溪县|