【牛客 - 696C】小w的禁忌与小G的长诗(dp 或 推公式容斥)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                【牛客 - 696C】小w的禁忌与小G的长诗(dp 或 推公式容斥)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                題干:
鏈接:https://ac.nowcoder.com/acm/contest/696/C
 來源:牛客網
 ?
自從上次小w被奶牛踹了之后,就一直對此耿耿于懷。
于是"cow"成為了小w的禁忌,而長得和"cow"很像的"owc"…凡是同時含有"c","w","o"的都進入了他的禁忌名單。
小G想給他送一幅幅長為n個字符的長詩,但是又怕觸犯他的禁忌。所以他決定要是詩中出現了他的禁忌就寧可不送,可是...他一寫起詩來就忘了一切。
小G想知道他有多少種的詩可能不觸犯他的禁忌
注:小G只會用小寫字母寫詩
輸入描述:
一行一個整數n表示詩的長度輸出描述:
一行一個整數表示小G有多少種可能的詩不觸犯小W的禁忌,由于可能數也許過大,請對109+7取膜后輸出示例1
輸入
復制
3輸出
復制
17570說明
n=3且包含"c","o","w"的只有6個串,所以答案是26^3-6=17570備注:
對于30%30%的數據滿足1≤n≤51≤n≤5
對于100%100%的數據滿足1≤n≤105
解題報告:
dp的思路不難想 ,就是dp[i][j] 前i個字符出現了 j?種 禁忌字符,注意是種,所以遞推方程就不難推了。復雜度On。
這題還有logn的做法,直接考慮容斥:答案=C(3,2)*可能含有兩個非法字符的方案數-C(3,1)*可能含有一個非法字符的方案數+C(3,0)*不含非法字符的方案數=C(3,2)*pow(25,n) - C(3,1)*pow(24,n) + C(3,0)*pow(23,n);直接快速冪求解,復雜度logn。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define F first #define S second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; const ll mod = 1e9+7; ll dp[MAX][3]; int n; int main() {cin>>n;dp[1][0]=23;dp[1][1]=3;dp[1][2]=0;for(int i = 2; i<=n; i++) {dp[i][0] = (dp[i-1][0] * 23)%mod;dp[i][1] = (dp[i-1][0] * 3 + dp[i-1][1]*24)%mod;dp[i][2] = (dp[i-1][1] * 2 + dp[i-1][2]*25)%mod;}printf("%lld\n",(dp[n][0]+dp[n][1]+dp[n][2])%mod);return 0 ; }?
總結
以上是生活随笔為你收集整理的【牛客 - 696C】小w的禁忌与小G的长诗(dp 或 推公式容斥)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【HDU - 5882】Balanced
- 下一篇: smsx.exe - smsx进程是什么
