PAT Basic 1040. 有幾個PAT(25)(C語言實現(xiàn))

我的PAT系列文章更新重心已移至Github,歡迎來看PAT題解的小伙伴請到Github Pages瀏覽最新內(nèi)容。此處文章目前已更新至與Github Pages同步。歡迎star我的repo

題目

字符串 APPAPT 中包含了兩個單詞 PAT,其中第一個 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二個
PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

現(xiàn)給定字符串,問一共可以形成多少個 PAT

輸入格式:

輸入只有一行,包含一個字符串,長度不超過 10^5 ,只包含 PAT 三種字母。

輸出格式:

在一行中輸出給定字符串中包含多少個 PAT。由于結(jié)果可能比較大,只輸出對 1000000007 取余數(shù)的結(jié)果。

輸入樣例:

APPAPT

輸出樣例:

2

思路

這明明是一道數(shù)學(xué)題 。。

怎么分析呢?從前向后掃描:

  • 每個A對應(yīng)的PA組合數(shù)量是A之前P的數(shù)量
  • 每個T對應(yīng)的PAT組合數(shù)量是T之前所有A對應(yīng)的PA組合數(shù)量的累加,
  • 所有的PAT組合數(shù)量是所有T對應(yīng)的PAT組合數(shù)量的累加

。。。懂?。。。

其實看通過率應(yīng)該是很多人都會的哈。這道題屬于典型的90%時間用于思考,10%時間用于碼代碼的類型。。。。

然后證明一下這個magic number——1000000007為什么是這個數(shù)(大概等于)以及什么時候應(yīng)該取模:
我們用有符號32位整型來計數(shù),按照我代碼里的變量名:P、PA、PAT。

  • P每次自增1,因此最大會達(dá)到10^5,不需取模。
  • PA每次累加P的值,我們來看一個比較極端的情況:
  • "PAPA ... (共50000對PA) ... PA",這樣記錄PA的組合數(shù)量,就是
    PA=1 + 2 + 3 + ... + 50000=2500050000,就已經(jīng)大于int了,因此計算PA應(yīng)該取模。
  • PAT每次累加PA的值,因此兩個值都會比較大,必須要取模。累加之后(取模之前)的數(shù)會小于2000000013,這個值小于int的最大值2^31-1=2147483647,不會溢出(模取得過大就會在沒來得及取模之前就溢出了,我覺得這是關(guān)鍵)。
  • 那用unsigned int呢,PA是不是不需要取模了?我覺得是的。
  • 這道題是要檢查答案的,用一個素數(shù)做模應(yīng)該有避免巧合答案的考慮。

寫完這個發(fā)現(xiàn)劉婼的博客 http://www.liuchuo.net/archives/573 也有相關(guān)的解釋,并且解題思路也不一樣,是累加每個A兩邊P和T的個數(shù)之積。

代碼

最新代碼@github,歡迎交流

#include <stdio.h>

#define LIM 1000000007

int main()
{
    int P = 0, PA = 0, PAT = 0;
    char c;

    while((c = getchar()) != '\n')
    {
        if(c == 'P')   P++;
        if(c == 'A')   PA = (PA + P) % LIM;
        if(c == 'T')   PAT = (PAT + PA) % LIM;
    }
    printf("%d", PAT);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 題目 字符串APPAPT中包含了兩個單詞“PAT”,其中第一個PAT是第2位(P),第4位(A),第6位(T);第...
    快把節(jié)操撿起來閱讀 573評論 0 0
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,470評論 3 44
  • 自小我就怕生病,不是生病難受,而是吃藥太費勁,每次吃藥,先把藥片碾成粉末,在勺子里撒一層糖,倒上藥粉,再撒一層糖。...
    期期艾艾的舌頭閱讀 609評論 0 2
  • 十歲時,我站在一個毫不起眼的角落,和洋洋灑灑的眾人一起暢想著未來的光。 十五歲時,我坐在凄冷凄冷的課桌邊,去追求那...
    我是詩人哇閱讀 265評論 0 1
  • 上周的工作因為做不好很焦慮 1、因為能力不夠,抗拒去做,怕被認(rèn)人說不好,所以做事不單但效果不好效率也差,內(nèi)心很焦慮...
    candymao閱讀 543評論 0 0