0
点赞
收藏
分享

微信扫一扫

B1040 有几个PAT (25 分 |简单数学,附详细注释,逻辑分析)


写在前面

  • 思路分析
  • 对于每1个A,它前面P的个数和它后面T的个数的乘积构成PAT个数。
  • 对于每1个A的结果相加即可
  • 先循环计数字符串有多少个T
  • 再循环计算
  • 每遇到1个T,cntt–
  • 每遇到1个P,cntp++
  • 每遇到字母A,结果累加cntt * cntp,并取余
  • 核心问题: 计数规律,​​最初理解错误​
  • 核心问题解决后,10分钟a题
  • 问题点
  • 大数相乘,避免溢出
  • ​result = (result + (cntp*cntt)%1000000007)%1000000007;​
  • 在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出

测试用例

input:
APPAPT
output:
2
input:
APPAPTAT
output:
7

ac代码

  • ​​参考链接​​

#include <iostream>
#include <string>
using namespace std;

int main() {
string s;
cin >> s;
int len = s.length(), result = 0, cntp = 0, cntt = 0;
for(int i=0; i<len; i++) {
if(s[i]=='T')
cntt++;
}
for(int i=0; i<len; i++) {
if(s[i] == 'P') cntp++;
if(s[i]=='T') cntt--;
if(s[i]=='A') result = (result + (cntp*cntt)%1000000007)%1000000007;
}
cout << result;
return 0;
}


举报

相关推荐

0 条评论