日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

YBTOJ:方程的解(组合数学)(插板法)

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YBTOJ:方程的解(组合数学)(插板法) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 題目描述
  • 解析
  • 代碼

題目描述

解析

第一感覺:啥都沒感覺出來。。。
直接拿動態(tài)規(guī)劃+高精做的
但是只能拿40
重新分析一下這道題:
g(x)首先可以拿快速冪很容易的求出來
問題就轉(zhuǎn)化為了**把g(x)個(gè)東西分成k份的方案數(shù)
其實(shí)答案就是C(k-1,n-1)
為什么是這樣?
介紹一種新的方法:隔板法
本題畫一下就是:

那么不難發(fā)現(xiàn),一共有n-1個(gè)空隙,插入k-1個(gè)板(題目已經(jīng)說明1,1,2和2,1,1是不一樣的方案)
所以就可以得出組合數(shù)的結(jié)論了

代碼

#include<iostream> #include<cstdio> #include<cstring>using namespace std;typedef long long ll;const int maxn = 1000; const int BIT = 4; const int MOD = 1e4;struct bign {int num[maxn], len;bool flag;friend bign abs(const bign &x) {bign k = x;k.flag = true;return k;}friend void remove(bign &x) {while (x.num[x.len] == 0 && x.len > 1)x.len--;}bign() {memset(num, 0, sizeof(num));flag = true;len = 1;}bign(const int &x) {*this = bign();if (x) {int k = x;if (k < 0)k = -k, flag = false;len = 0;while (k) {num[++len] = k % MOD;k /= MOD;}}}bign(const ll &x) {*this = bign();if (x) {ll k = x;if (k < 0)k = -k, flag = false;len = 0;while (k) {num[++len] = k % MOD;k /= MOD;}}}bign(const char *x) {int l = strlen(x), s, t = 0, p = 0, k = 1;*this = bign();if (x[0] == '-')flag = false, s = 1;len = 0;for (int i = l - 1; i >= s; i--) {p += k * (x[i] - '0');k *= 10;t++;if (t == 4) {t = 0;num[++len] = p;p = 0;k = 1;}}if (p)num[++len] = p;}bign(const string x) {int l = x.length(), s = 0, t = 0, p = 0, k = 1;*this = bign();if (x[0] == '-')flag = false, s = 1;len = 0;for (int i = l - 1; i >= s; i--) {p += k * (x[i] - '0');k *= 10;t++;if (t == BIT) {t = 0;num[++len] = p;p = 0;k = 1;}}if (p)num[++len] = p;}bign operator=(const int &x) {return *this = bign(x);}bign operator=(const ll &x) {return *this = bign(x);}bign operator=(const char *x) {return *this = bign(x);}bign operator=(const string &x) {return *this = bign(x);}bool operator<(const bign &x) const {if (flag != x.flag)return flag < x.flag;if (len != x.len)return (len < x.len) ^ flag ^ 1;for (int i = len; i >= 1; i--) {if (num[i] != x.num[i]) {return (num[i] < x.num[i]) ^ flag ^ 1;}}return false;}bool operator<(const int &x) const {return *this < bign(x);}bool operator<(const ll &x) const {return *this < bign(x);}bool operator>(const bign &x) const {return x < *this;}bool operator>(const int &x) const {return *this > bign(x);}bool operator>(const ll &x) const {return *this > bign(x);}bool operator<=(const bign &x) const {return !(*this > x);}bool operator<=(const int &x) const {return *this <= bign(x);}bool operator<=(const ll &x) const {return *this <= bign(x);}bool operator>=(const bign &x) const {return !(*this < x);}bool operator>=(const int &x) const {return *this >= bign(x);}bool operator>=(const ll &x) const {return *this >= bign(x);}bool operator==(const bign &x) const {if (flag != x.flag)return false;if (len != x.len)return false;for (int i = len; i >= 1; i--) {if (num[i] != x.num[i]) {return false;}}return true;}bool operator==(const int &x) const {return *this == bign(x);}bool operator==(const ll &x) const {return *this == bign(x);}bool operator!=(const bign &x) const {return !(*this == x);}bool operator!=(const int &x) const {return *this != bign(x);}bool operator!=(const ll &x) const {return *this != bign(x);}friend istream &operator>>(istream &in, bign &x) {string s;in >> s;x = s;return in;}friend ostream &operator<<(ostream &out, const bign &x) {if (x.flag == false && x != 0)out << "-";out << x.num[x.len];for (int i = x.len - 1; i >= 1; i--)printf("%0*d", BIT, x.num[i]);return out;}bign operator-() const {bign k = *this;k.flag ^= 1;return k;}bign operator+(const bign &x) const {if (flag && x.flag) {bign k = bign();k.len = 0;for (int i = 1, g = 0; g || i <= len || i <= x.len; i++) {int p = num[i] + x.num[i] + g;k.num[++k.len] = p % MOD;g = p / MOD;}return k;}if (flag && !x.flag)return *this - (-x);if (!flag && x.flag)return x - (-*this);return -((-x) + (-*this));}bign operator+(const int &x) const {return *this + bign(x);}bign operator+=(const bign &x) {return *this = *this + x;}bign operator+=(const int &x) {return *this += bign(x);}bign operator+=(const ll &x) {return *this += bign(x);}bign operator++() {return *this += 1;}bign operator++(int) {bign k = *this;*this += 1;return k;}bign operator-(const bign &x) const {if (flag && x.flag && *this >= x) {bign k = bign();k.len = 0;for (int i = 1, g = 0; g || i <= len; i++) {int p = num[i] - x.num[i] + g;if (p < 0)g = -1;else g = 0;k.num[++k.len] = (p % MOD + MOD) % MOD;}remove(k);return k;}if (flag && x.flag)return -(x - *this);if (flag && !x.flag)return *this + (-x);if (!flag && x.flag)return -((-*this) + x);return (-x) - (-*this);}bign operator-=(const bign &x) {*this = *this - x;return *this;}bign operator-=(const int &x) {return *this -= bign(x);}bign operator-=(const ll &x) {return *this -= bign(x);}bign operator--() {return *this -= 1;}bign operator--(int) {bign k = *this;*this -= 1;return k;}bign operator*(const bign &x) const {bign k;k.flag = (flag == x.flag);k.len = len + x.len + 1;for (int i = 1; i <= len; i++) {for (int j = 1; j <= x.len; j++) {k.num[i + j - 1] += num[i] * x.num[j];k.num[i + j] += k.num[i + j - 1] / MOD;k.num[i + j - 1] %= MOD;}}remove(k);return k;}bign operator*(const int &x) const {bign k = bign();k.len = 0;long long t[maxn];memset(t, 0, sizeof(t));for (int i = 1; i <= len; i++)t[i] = num[i] * x;for (int i = 1, g = 0; i <= len || g; i++) {k.num[++k.len] = (g + t[i]) % MOD;g = (g + t[i]) / MOD;}return k;}bign operator*(const ll &x) const {bign k = bign();k.len = 0;long long t[maxn];memset(t, 0, sizeof(t));for (int i = 1; i <= len; i++)t[i] = num[i] * x;for (int i = 1, g = 0; i <= len || g; i++) {k.num[++k.len] = (g + t[i]) % MOD;g = (g + t[i]) / MOD;}return k;}bign operator*=(const bign &x) {return *this = *this * x;}bign operator*=(const int &x) {return *this = *this * x;}bign operator*=(const ll &x) {return *this = *this * x;}bign operator/(const bign &x) const {if (x == 0)return bign();bign k = bign(), a = bign();k.flag = (flag == x.flag);k.len = len;for (int i = len; i >= 1; i--) {a = a * MOD + num[i];while (a >= abs(x)) {a -= abs(x);k.num[i]++;}} // if ((flag != x.flag) & a != 0) // k--; //取模remove(k);return k;}bign operator/(const int &x) const {if (x == 0)return bign();bign k = bign();int a = 0;k.flag = (flag == (x >= 0));k.len = len;for (int i = len; i >= 1; i--) {a = a * MOD + num[i];k.num[i] = a / x;a %= x;} // if ((flag != x.flag) & a != 0) // k--; //取模remove(k);return k;}bign operator/(const ll &x) const {if (x == 0)return bign();bign k = bign();int a = 0;k.flag = (flag == (x >= 0));k.len = len;for (int i = len; i >= 1; i--) {a = a * MOD + num[i];k.num[i] = a / x;a %= x;} // if ((flag != x.flag) & a != 0) // k--; //取模remove(k);return k;}bign operator/=(const bign &x) {return *this = *this / x;}bign operator/=(const int &x) {return *this = *this / x;}bign operator/=(const ll &x) {return *this = *this / x;}bign operator%(const bign &x) const {if (x == 0)return bign();bign a = bign();for (int i = len; i >= 1; i--) {a = a * MOD + num[i];while (a >= abs(x))a -= abs(x);} // if (a == 0)return a; // if (flag && x.flag)return a; // if (flag && !x.flag)return a + x; // if (!flag && x.flag)return x - a; // return -a;//取模if (flag)return a;return -a;}bign operator%(const int &x) const {return *this % bign(x);}bign operator%(const ll &x) const {return *this % bign(x);}bign operator%=(const bign &x) {return *this = *this % x;}bign operator%=(const int &x) {return *this %= bign(x);}bign operator%=(const ll &x) {return *this %= bign(x);}friend bign pow(const bign &x, const bign &y) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans *= cnt;cnt *= cnt;w /= 2;}return ans;}friend bign pow(const int &x, const bign &y) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans *= cnt;cnt *= cnt;w /= 2;}return ans;}friend bign pow(const bign &x, const int &y) {bign ans = 1, cnt = x;int w = y;while (w) {if (w & 1)ans *= cnt;cnt *= cnt;w >>= 1;}return ans;}friend bign powmod(const bign &x, const bign &y, const bign &z) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w /= 2;}return ans;}friend bign powmod(const int &x, const bign &y, const bign &z) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w /= 2;}return ans;}friend bign powmod(const bign &x, const int &y, const bign &z) {bign ans = 1, cnt = x;int w = y;while (w) {if (w & 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w >>= 1;}return ans;}friend bign powmod(const bign &x, const bign &y, const int &z) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w /= 2;}return ans;}friend bign powmod(const int &x, const bign &y, const int &z) {bign ans = 1, cnt = x, w = y;while (w > 0) {if (w % 2 == 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w /= 2;}return ans;}friend bign powmod(const bign &x, const int &y, const int &z) {bign ans = 1, cnt = x;int w = y;while (w) {if (w & 1)ans = ans * cnt % z;cnt = cnt * cnt % z;w >>= 1;}return ans;}friend bign max(const bign &x, const bign &y) {return x > y ? x : y;}friend bign min(const bign &x, const bign &y) {return x < y ? x : y;} };#define ll bign const int N=4e5+100; const int mod=1000; int t,k,x; int n; long long ksm(int x,int p){long long tot=1,res=x;while(p){if(p&1) tot=tot*res%mod;res=res*res%mod;p>>=1;}return tot%mod; } int main(){scanf("%d%d",&k,&x);n=ksm(x,x);//n-=k;ll ans=1;for(int i=2;i<=n-1;i++) ans*=i;for(int i=2;i<=k-1;i++) ans/=i;for(int i=2;i<=n-k;i++) ans/=i;cout<<ans; } /* WW.WBBBBB */ 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的YBTOJ:方程的解(组合数学)(插板法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。