hdu 5106 組合數學 找規律

2021-06-27 01:22:49 字數 1332 閱讀 5866

給定n和r,要求算出[0,r)之間所有n-onebit數的和,n-onebit數是所有數字中1的個數。

對於乙個n-bit數,可以根據與r最高不同位的位置分成幾類。比如r=100100010,可以分成0******xx,1000***xx,10010000x三類。x處可任取0或者1。x的個數為n,x中1的個數為k。和分兩部分,高於n位的有c(n,k)乘以n位之前的數字,低於n位的部分有c(n-1,k-1)*(2^n−1) ( 對於k個1中的某乙個1的位置,這個位置上有1在所有情況中占有了c(n-1,k-1)種情況,那麼就相當於11...11(n個位置每個位置上都可能有1)*c(n-1,k-1),即c(n-1,k-1)*(2^n−1) )

三次相乘一定要在第二次中間加乙個%mod,血的教訓!

生成組合數的公式

#include #include #include #include #include #include #define rd(x) scanf("%d",&x)

#define rd2(x,y) scanf("%d%d",&x,&y)

#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define clr0(x) memset(x,0,sizeof(x))

#define clr1(x) memset(x,-1,sizeof(x))

using namespace std;

typedef long long ll;

const int maxn = 1005;

const double eps = 1e-3;

const int inf = 0x7fffffff;

char p[maxn];

const ll mod = 1000000007;

ll c[maxn][maxn];

ll q[maxn];

void init()

for(int i = 1 ; i < maxn ; i++)

}// c[0][0] = 1;

// for(int i = 1;i < maxn;++i)

// for(int j = 0;j < i;++j)

q[0] = 1;

for(int i = 1;i < maxn;++i)

}int main()

tmp = (tmp*2 + p[st] - '0')%mod;

k += p[st] - '0';

}if(ans < 0) ans += mod;

printf("%i64d\n",ans);

}return 0;

}

hdu 5106 同餘定理 組合數學 快速冪

首先要取模,就要用到同餘模定理,具體不細講,只是在中間過程取模,防止溢位 在統計時考慮,逐位進行,因為不考慮數本身,所以每當遇到1時,考慮後面還需要n個 還剩多少m位,所以就有c m,n 個數,因為這些數的字首相同,所以最終結果可以通過字首 個數獲得這部分的和,然後考慮每個位上是 的情況是c m 1...

HDU 5698 組合數學

傳送門 計算走i步的方法數 走i步 可以分解為在x方向上走的 x1,x2,xi 在y1,y2,yi 步 就是將 n 1分解為i的不為0的數,就相當於在n 2個空裡插入i 1個版 將 m 1 分解為i個不為0的數 也就是 c n 2,i 1 c m 2,i 1 總數也就是sum c n 2,i 1 c...

hdu 6143 組合數學 dp

題意 m個字母,組成兩個長度為n的字元,其中乙個字母不能同時出現在兩個串中。問總方案?思路 列舉m個中恰好有i個在第乙個串,有j個在第二個串。然後求個和。具體其中n個空恰好k種顏色,可以用dp預處理。dp j i dp j 1 i i mod dp j 1 i 1 i mod mod include...