標籤:數論 組合數學
很無語的一個題。
反正我後來看題解完全不是一個道上的。
要用什麼組合數學的lucas定理。
表示自己就推了前面幾個數然後找找規律。
C(n, m) 就是 組合n取m;
(m!(n-m!)/n!)
如果n==11 ;
C(11,0);C(11,1);C(11,2);C(11,3);C(11,4);C(11,5);
分別為
(1/1); (1 / 11) ; (11*10 / 2*1) ; (11*10*9 / 3*2*1); (11*10*9*8 / 4*3*2*1) ; (11*10*9*8*7 / 5*4*3*2*1);
C(11,11);C(11,10);C(11,9);C(11,8);C(11,7);C(11,6);
這兩個都是相等的。(參見排列組合)
若要 C(n,m)為奇數,必須 分子分母 約分後都是奇數。
發現如果純類比的肯定會逾時的。
當時發現 當n==2^? 都是可以被除掉的,就只有 C(n,0);和 C(n,n) 都是 1,奇數。
而 n==(2^?)-1 的時候結果就是 2^n 。
然後推了前面幾個數
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
2,2,4,2,4,4,8,2,4,4 ,8 ,4 ,8 ,8 ,16,2
巨像 樹狀數組。。。想到樹狀數組是取& 。
然後我就 轉換 n 的二進位。發現有m個1 ,結果就是 2^m ;
於是終於AC。→ _ → 數學好伐。
#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<stack>#include<iostream>#include<list>#include<set>#include<cmath>#define INF 0x7fffffff#define eps 1e-6using namespace std;int shift(int n){ int cot=0; while(n) { if(n%2==1)cot++; n/=2; } return cot;}int main(){ int n,m; while(scanf("%d",&n)!=EOF) { m=shift(n); cout<<pow(2,m)<<endl; }}