很是無語的一個題。ios
反正我後來看題解全然不是一個道上的。數組
要用什麼組合數學的lucas定理。spa
表示本身就推了前面幾個數而後找找規律。code
C(n, m) 就是 組合n取m;blog
(m!(n-m!)/n!)
ip
假設n==11 ;
數學
C(11,0);C(11,1);C(11,2);C(11,3);C(11,4);C(11,5);string
分別爲it
(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);io
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-6 using 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; } }