题目链接https://nanti.jisuanke.com/t/41175
自从百度之星初赛一上自己做出来一道打表找规律的题之后,这种膨胀的感觉让我近乎丧失理智,今天这道题我死死盯了两三个小时硬是没看出什么规律,我还是太嫩了点~,这也是我头一次做递推的题,题量还有待替高啊!
如果相对了思路(看了大佬的精彩解析https://blog.csdn.net/chenzhenyu123456/article/details/48579695),这道题就可以迎刃而解了
首先需要开一个结构体变量,用来存储不同元素的1.‘c’的个数2.字符串长度3.对应字符串上的所有‘c’所在位置下标的和4.元素值,稍作思考就可以得到以下关系了:
1.‘c’的个数:a2.num=a0.num+a1.num
2.字符串长度:a2.len=a0.len+a1.len
3.对应字符串上的所有‘c’所在位置下标的和:a2.sum=a0.num+a1.num+a0.len*a1.num
4.元素值:a2.val=a0.val+a1.val+(a1.sum+a0.len*a1.num)*a0.num-a1.num*a0.sum
Ps:求余的部分需要特别注意,很容易出错。
详见代码:
#include<bits/stdc++.h> using namespace std;
const long long aha=;
struct ha{
long long len,sum,val,num;
ha(){}
ha(long long x,long long y,long long z,long long p):len(x),sum(y),val(z),num(p){}
};
int t,n;
int main(){
scanf("%d",&t);
for(int Case=;Case<=t;Case++){
scanf("%d",&n);
ha a0(,,,),a1(,,,),a2;
n-=;
while(n--){
a2=ha((a0.len+a1.len)%aha,
((a0.sum+a1.sum)%aha+a0.len*a1.num%aha)%aha,
(((a0.val+a1.val)%aha+(a1.sum+a0.len*a1.num)%aha*a0.num%aha)%aha-a1.num*a0.sum%aha+aha)%aha,
(a0.num+a1.num)%aha);
a0=a1;
a1=a2;
//printf("len=%lld,sum=%lld,val=%lld,num=%lld\n",a2.len,a2.sum,a2.val,a2.num);
}
printf("Case #%d: %lld\n",Case,a2.val);
}
return ;
}