hdu4346 枚举思维

来源:互联网 发布:beat it 编辑:程序博客网 时间:2024/05/15 04:56

http://acm.hdu.edu.cn/showproblem.php?pid=4346

Problem Description
There is a road from city A to city B.On the road,there are N positions(indexed from 0 to N-1).In order to celebrate the Multi-University training,the mayor of city A commands a worker to insert N flags on the N positions.The color of a flag is either red or green.We call the road is beautiful if and only if there exists at least one pair of non-negative integers (a,b) (0<=a<b<N and (a+b) is an even number) such that both a-th flag and b-th flag are red and (a+b)/2-th flag is green.Otherwise we call the road is ugly.Now,some positions have already been inserted flags.In order to make the road beautiful,the worker must carefully insert the flags on the positions which haven't been inserted.He wants to know how many different types of beautiful road he can make.The type of the road only depends on the flags' color.
 

Input
The first line of the input is the number of cases. On each case there is a line consists of a string.The length of the string is N.(0<=N<=800).The i-th character of the string is 'R' or 'G' or '?'.'R' means the flag on the i-th position which has been inserted is red.'G' means the flag on the i-th position which has been inserted is green.'?' means the i-th position hasn't been inserted a flag.
 

Output
A single line with the number of different types of road the worker can make,modulo 1,000,000,007.
 

Sample Input
4?GRG????????
 

Sample Output
0114
/**http://blog.csdn.net/julyana_lin/article/details/7849006*/#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;typedef long long LL;const int mod=1000000007;LL mod_pow(int a,int n,int p){    LL ret=1;    LL A=a;    while(n)    {        if(n&1)        {            ret=(ret*A)%p;        }        A=(A*A)%p;        n>>=1;    }    return ret;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        char a[1005];        scanf("%s",a);        int n=strlen(a);        int unknown=0,r_num=0;        for(int i=0;i<n;i++)        {            if(a[i]=='?')                unknown++;            else if(a[i]=='R')                r_num++;        }        LL unbea=(r_num==0);        for(int i=0;i<n;i++)        {            if(a[i]=='R'||a[i]=='?')            {                int x=(a[i]=='R');                unbea=(unbea+(x==r_num))%mod;                for(int len=1;len+i<n;len+=2)                {                    int y=x;                    for(int j=i+len;j<n;j+=len)                    {                        y+=(a[j]=='R');                        if(a[j]=='G')break;                        unbea=(unbea+(y==r_num))%mod;                    }                }            }        }        printf("%I64d\n",mod_pow(2,unknown,mod)-unbea);    }    return 0;}


0 0