题目链接:http://codeforces.com/contest/805/problem/D
题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次。
题解:这题可以多列几组来找规律,事实上是可以递推的,递推可得到一个式子
a[n]=2*a[n-1]+1,然后化成通项公式.
a[n]+1=2*(a[n-1]+1),a[n]+1=2^n,a[n]=2^n-1;
然后就可以解决b前面有几个a的问题了,ab=2^1-1,aab=2^2-1,
#include <iostream> #include <cstring> #include <string> #define mod 1000000007 using namespace std; typedef long long ll; const int M = 1e6 + 10; string s , sl; ll fpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) { res = (res * a) % mod; } a = a * a % mod; b >>= 1; } return res; } int main() { cin >> s; int len = s.size(); int l = 0 , r = len - 1; for(int i = 0 ; i < len ; i++) { if(s[i] == 'a') { l = i; break; } } for(int i = len - 1 ; i >= 0 ; i--) { if(s[i] == 'b') { r = i; break; } } for(int i = l ; i <= r ; i++) { sl += s[i]; } len = sl.size(); ll count = 0 , sum = 0; for(int i = 0 ; i < len ; i++) { if(sl[i] == 'a') { count++; } if(sl[i] == 'b') { sum += fpow(2 , count) - 1; sum = (sum + mod) % mod; } } cout << (sum + mod) % mod << endl; return 0; }