思路:
考慮 把男生排成一排 女生和老師往裡插
分成兩種情況.
1. 女生中間夾著老師
2. 女生中間沒有夾著老師
求一下組合* 階乘就好了
先放python** 簡潔易懂
def
fact
(n):
temp=1
for i in range(1,n+1):
temp*=i
return temp
defc
(n,m):
if(nreturn
0return fact(n)/fact(m)/fact(n-m)
n, m = raw_input().split()
n=int(n)
m=int(m)
print (fact(n+2)-fact(n+1)*2)*fact(m)*c(n+3,m)+m*fact(n+1)*2*fact(m-1)*c(n+2,m-1)
高精寫掛了好幾次… 尷尬
//by siriusren
#include #include #include using namespace std;
struct node
int a[20050],len;
}fst,n_plus_one,n_plus_two,n_plus_three,m,m_minus_one,c1,c2,ans;
int n,m;
node operator*(node a,int b)return a;
}node operator-(node a,node b)
for(int i=a.len
-1;~i;i--)
else
if(!i)a.len
=0; }return a;
}node operator+(node a,node b)return a;
}node operator/(node a,int b)
for(int i=a.len
-1;~i;i--)
else
if(!i)a.len
=0; }
return a;
}node operator*(node a,node b)
}for(int i=0;i<=a.len
+10+b.len;i++)return c;
}node print(node a)
int main()fst.init();fst.a[0]=1;fst.len
=1; for(int i=m+1;i<=n+3;i++)fst=fst*i;
c1=fst;
fst=fst*m,fst=fst/(n+3),c2=fst;
if(n+3
len=c1.len
=0; for(int i=1;i<=n-m+3;i++)c1=c1/i,c2=c2/i;
ans=(n_plus_two-n_plus_one*2)*m*c1+n_plus_one*m*m_minus_one*c2*2;
print(ans);
}
BZOJ2729 排隊(組合數學 高精度)
hnoi2012 排隊 題意 某中學有 n 名男同學,m 名女同學和兩名老師要排隊參加體檢。他們排成一條直線,並且任意兩名女同學不能相鄰,兩名老師也不能相鄰,那麼一共有多少種排法呢?任意兩人不同 排列組合 高精度 考慮先放男生,後放老師,再放女生 先用男生把兩個老師隔開,再用男生和老師把所有女生隔開...
洛谷 P1037 floyd 組合數學 高精度
給出乙個整數n n 1030 n n 10 n n 1030 和k k k個變換規則 k 15 k le 15 k 15 規則 一位數可變換成另乙個一位數 規則的右部不能為零。例如 n 234n 234n 234。有規則 k 2 2 5 3 6 上面的整數234經過變換後可能產生出的整數為 包括原數...
演算法題 高精度乘法求組合數(Python)
輸入a,求cba的值。注意結果可能很大,需要使用高精度計算。輸入格式 共一行,包含兩個整數a和b。輸出格式 共一行,輸出cba的值。資料範圍 1 b a 5000 輸入樣例 5 3輸出樣例 10 線性篩法篩質數 def get primes n primes st true n for i in r...