csp模擬 字串問題 計數 組合數學

2021-09-29 13:55:17 字數 1418 閱讀 8882

傳送門

又是乙個計數題,,

在n個數中間填加號,求所有方案的數字和。

下面提供兩種解法,題解的和來自fsy的。

題解:考慮每個區間對數的貢獻,要麼沒有貢獻,要麼貢獻是10的冪。

故我們可以列舉使得這個數的係數為10^i時,區間的個數。發現是個組合數。

發現這樣列舉實際上是固定了該點所在區間的右端點,也就是說固定了乙個加號的位置。設當前點為i,對i的貢獻為10^j,則右端點為i+j。

發現i~i+j不能填加號,共j個位置。而i+j右邊強制加了乙個加號。所以剩下的加號方案為

故貢獻為

發現複雜度n^2,考慮交換列舉順序。如果先列舉j,即先列舉區間右端點到點i的距離。

於是等差數列求和即可。

方法2:

考慮列舉區間,計算區間被計算的次數。

在不考慮1和n兩個端點的情況下,考慮乙個區間[l,r]。

使得這個區間存在的條件是區間左右各有乙個加號,區間內部沒有加號。

所以加號的組合方案為

發現複雜度為n^2,發現組合數隻跟區間長度len有關,考慮如何計算長度為len的所有區間和。

如果有樣例abcdefg

發現長度為1的和是a,b,c,d,e,f,g

長度為2的是ab,bc,cd,de,ef,fg

也就是10*(a+b+c+d+e+f)+(b+c+d+e+f+g)。

多舉幾個例子,你會發現,對於乙個長度len,其答案為(len-1)的答案去掉最後一項*10,然後加上乙個個位的字尾和。

所以維護字尾和然後該怎麼計算怎麼計算。

對於區間端點為1或者n的,自己手玩一下該怎麼算,區別不大。

#includeusing namespace std;

#define in read()

#define int long long

int in

while(isdigit(ch))return cnt*f;

}int fac[1000003],ifac[1000003];

int sum[1000003];

int suml[1000003];

int n,m;char ch[1000003];

const int mod=998244353;

int ksm(int a,int b)return gu;

}int jz[1000003];

int sumsuf[1000003];

int tem;

signed main()//cout<

for(int i=1;i

//cout<

for(int i=2;i<=n;i++)

// ans=(ans+sum[n]*(m==0)+mod)%mod;

cout<

return 0;

}

1884 變換字串(模擬,組合數)

有乙個字串s,長度為n,現在要對其作變換。變換的規則如下 對於第i 1 i n 個字元,可以保持不變,或者變換為第i 1個字元 如果有的話 或者第i 1個字元 如果有的話 請計算一下最多可以變換出多少種不同的字串,最後總數對 1000000007 109 7 1000000007 109 7 取餘後...

字串陣列問題

這個題目關鍵就是如何處理乙個一千位的數,當時考慮用long long int 等發現都不可行,於是把思路放到了陣列,又首先考慮到了是整形陣列,但是後來發現,如果使用整形陣列會導致很難區分這個數個位之後的零和其他位的零。於是利用了字串型陣列。這題也讓我撿起來了幾個知識點1.當把乙個字串按字元乙個個放入...

CSP之URL對映(字串模擬,90分)

問題描述 試題編號 201803 3 試題名稱 url對映 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 url 對映是諸如 django ruby on rails 等網頁框架 web frameworks 的乙個重要元件。對於從瀏覽器發來的 http 請求,url 對映模組...