[BZOJ2227][Zjoi2011][找规律][排列组合][数学]看电影(movie)
2017-03-12 22:17
351 查看
首先数据很小……可以打表……找规律
找出来是(k+1)n−1∗(k−n+1)kn
证明可以看这篇…
我的约分的方法比较奇怪,因为只有200以下的因子,就暴力枚举1~200,分子分母能同时除就除掉,当初是从Manchery那看到的,感觉打起来要方便一点……
找出来是(k+1)n−1∗(k−n+1)kn
证明可以看这篇…
我的约分的方法比较奇怪,因为只有200以下的因子,就暴力枚举1~200,分子分母能同时除就除掉,当初是从Manchery那看到的,感觉打起来要方便一点……
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> using namespace std; int n,k,t; int p[210],c[210]; struct Int{ int a[1010],sz; #define base 100000 Int(int x=0){ memset(a,0,sizeof(a)); sz=0; while(x)a[++sz]=x%base,x/=base; } int &operator [](int x){ return a[x]; } inline bool empty(){ return sz==1&&a[1]==0; } friend Int operator +(Int A,Int B){ Int C; C.sz=A.sz+B.sz; if(B.empty()) return A; if(A.empty()) return B; for(int i=1;i<=C.sz;i++) C[i]=A[i]+B[i]; for(int i=1;i<=C.sz;i++) if(C[i]>=base){C[i+1]+=C[i]/base,C[i]%=base; if(i==C.sz)C.sz++;} return C; } friend Int operator *(Int A,Int B){ Int C; C.sz=A.sz+B.sz-1; if(B.empty()) return B; for(int i=1;i<=A.sz;i++) for(int j=1;j<=B.sz;j++) C[i+j-1]+=A[i]*B[j]; for(int i=1;i<=C.sz;i++) if(C[i]>=base){C[i+1]+=C[i]/base,C[i]%=base; if(i==C.sz)C.sz++;} return C; } friend Int operator -(Int A,Int B){ for(int i=1;i<=B.sz;i++) A[i]-=B[i]; for(int i=1;i<=A.sz;i++) if(A[i]<0) A[i]+=base,A[i+1]--; while(!A[A.sz]&&A.sz) A.sz--; if(!A.sz) A.sz++; return A; } friend Int operator /(Int A,int B){ int x=0; for(int i=A.sz;i;i--){ int t=(A[i]+x*base)%B; A[i]=(A[i]+x*base)/B; x=t; } while(!A[A.sz]&&A.sz) A.sz--; return A; } friend Int operator %(Int A,int B){ return A-(A/B)*B; } Int &operator *=(int B){ *this=*this*B; return *this; } Int &operator /=(int B){ *this=*this/B; return *this; } inline void print(){ if(!sz) putchar(48); printf("%d",a[sz]);for(int i=sz-1;i;i--) printf("%05d",a[i]); } }; inline void simplify(Int &A,Int &B){ for(int i=2;i<=200;i++) while((A%i).empty()&&(B%i).empty()) A/=i,B/=i; } Int Ans,Ans1; int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); if(k<n) { puts("0 1"); continue; } Ans=1; Ans1=1; for(int i=1;i<=n-1;i++) Ans*=k+1; for(int i=1;i<=n;i++) Ans1*=k; Ans*=k-n+1; simplify(Ans,Ans1); Ans.print(); putchar(' '); Ans1.print(); putchar('\n'); } }
相关文章推荐
- [组合数学] BZOJ 2227 [Zjoi2011]看电影(movie)
- [BZOJ2227][Zjoi2011]看电影(movie)(组合数学+高精)
- BZOJ2227 [Zjoi2011]看电影(movie)
- 【BZOJ2227】【ZJOI2011】看电影 [组合数][质因数分解]
- [BZOJ2111][ZJOI2010]Perm 排列计数(组合数学+lucas定理)
- BZOJ 2111: [ZJOI2010]Perm 排列计数(简单组合数学)
- [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
- 2227: [Zjoi2011]看电影(movie)
- BZOJ 2111: [ZJOI2010]Perm 排列计数|组合数学|Lucas定理|DP
- [bzoj2111][ZJOI2010]Perm 排列计数(组合数学)
- 2227: [Zjoi2011]看电影(movie)
- BZOJ 2111 ZJOI2010 Perm 排列计数 组合数学+Lucas定理
- bzoj 2111: [ZJOI2010]Perm 排列计数 (组合数学+Lucas定理)
- BZOJ 2111 ZJOI2010 Perm 排列计数 组合数学+Lucas定理
- BZOJ_4517_[Sdoi2016]排列计数_组合数学
- [数学杂题]BZOJ 2111—— [ZJOI2010]Perm 排列计数
- bzoj 3294: [Cqoi2011]放棋子 动态规划+排列组合
- bzoj2227: [Zjoi2011]看电影(movie)
- ZJOI2011 Day1 ( bzoj2227~2229 ) 题解
- BZOJ 4517|SDOI 2016|排列计数|错排公式|组合数学