Problem Description
Young theoretical computer scientist Fxx get a string which contains lowercase letters only.
The string S contains n lowercase letters S1S2…Sn .Now Fxx wants to know how many three tuple (i,j,k) there are which can meet the following conditions:
1、 i,j,k are adjacent into a geometric sequence.
2、 Si= ' y ' ,Sj= ' r ' ,Sk= ' x '.
3.Either j|i or j|k
The string S contains n lowercase letters S1S2…Sn .Now Fxx wants to know how many three tuple (i,j,k) there are which can meet the following conditions:
1、 i,j,k are adjacent into a geometric sequence.
2、 Si= ' y ' ,Sj= ' r ' ,Sk= ' x '.
3.Either j|i or j|k
Input
In the first line, there is an integer
T(1≤T≤100)
indicating the number of test cases.
T lines follow, each line contains a string, which contains only lowercase letters.(The length of string will not exceed 10000 ).
T lines follow, each line contains a string, which contains only lowercase letters.(The length of string will not exceed 10000 ).
Output
For each case, output the answer.
Sample Input
2 xyyrxx yyrrxxxxx
Sample Output
0 2
Source
这道题我被hack了等比数列,递增的和递减的都可以,我只考虑了一面
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char ss[10010];
scanf("%s",ss);
int len=strlen(ss);
for(int i=len; i>=1; i--)
{
ss[i]=ss[i-1];
}
ss[0]='0';
int sum=0,a1,a2,a3;
for(int i=2; i*i<=len; i++)
{
for(int j=1; j<=len; j++)
{
a1=j;
a2=a1*i;
a3=a2*i;
if(a3<=len&&ss[a1]=='y'&&ss[a2]=='r'&&ss[a3]=='x')
{
sum++;
}
}
}
for(int i=2; i*i<=len; i++)
{
for(int j=1; j<=len; j++)
{
if(j%(i*i)==0)
{
a1=j,a2=a1/i,a3=a2/i;
if(a3>=1&&ss[a1]=='y'&&ss[a2]=='r'&&ss[a3]=='x')
{
sum++;
}
}
}
}
printf("%d\n",sum);
}
return 0;
}