/* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long long #define N 1000007 #define M 1000000007 using namespace std; ll n,k,ans,cnt1,cnt0; ll inv[N]={1,1},fac[N]={1,1},f[N]={1,1}; inline ll read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline void init() { for(int i=2;i<=N;i++) { fac[i]=(fac[i-1]%M*i%M)%M; f[i]=((M-M/i)%M*f[M%i])%M; inv[i]=(inv[i-1]*f[i]%M)%M; } } inline ll C(ll a,ll b) { return fac[a]%M*inv[b]%M*inv[a-b]%M; } int main() { freopen("cube.in","r",stdin); freopen("cube.out","w",stdout); n=read();k=read();init(); printf("%I64d ",C(n,k)); return 0; }
/* 做最大生成树时标记哪些边被加了进去。然后把这些边排序。 如果询问权值w的货物,就在边中查找小于w的最大值假设拍第k大 答案就是k+1。 复杂度O(qlogn) */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 100007 using namespace std; int n,m,q,ans,cnt,num; int head[N],fa[N]; struct edge{ int u,v,w,net,pos; bool operator < (const edge &a) const{ return w>a.w; } }e[N<<1],E[N],tmp[N<<1]; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline void add(int u,int v,int w) { e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w; e[cnt].net=head[u];head[u]=cnt; } int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} void kruskal() { int r1,r2; sort(E+1,E+m+1); for(int i=1;i<=m;i++) { r1=find(E[i].u),r2=find(E[i].v); if(r1==r2)continue; fa[r1]=r2;num++; add(E[i].u,E[i].v,E[i].w);add(E[i].v,E[i].u,E[i].w); tmp[num].pos=num;tmp[num].u=E[i].u,tmp[num].v=E[i].v;tmp[num].w=E[i].w; if(num==n-1) break; } } int serch(int x) { int l=1,r=n-1,mid; while(l<=r) { mid=l+r>>1; if(tmp[mid].w>=x) l=mid+1; else ans=mid,r=mid-1; }return num-ans+1; } int main() { freopen("warehouse.in","r",stdin); freopen("warehouse.out","w",stdout); int x,y,z,k; n=read();m=read();q=read(); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) { E[i].u=read();E[i].v=read();E[i].w=read(); }kruskal(); for(int i=1;i<=q;i++) { x=read(); if(x<=e[cnt].w){printf("1 ");continue;} if(x>e[1].w){printf("%d ",n);continue;} k=serch(x); printf("%d ",k+1); } return 0; }