ACM-Jesus Is Here[遞推]2015沈陽online ...
題目鏈接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:求餘的部分需要特別註意,很容易出錯。
詳見代碼:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 const long long aha=530600414; 5 struct ha{ 6 long long len,sum,val,num; 7 ha(){} 8 ha(long long x,long long y,long long z,long long p):len(x),sum(y),val(z),num(p){} 9 }; 10 int t,n; 11 int main(){ 12 scanf("%d",&t); 13 for(int Case=1;Case<=t;Case++){ 14 scanf("%d",&n); 15 ha a0(1,1,0,1),a1(2,0,0,0),a2; 16 n-=2; 17 while(n--){ 18 a2=ha((a0.len+a1.len)%aha, 19 ((a0.sum+a1.sum)%aha+a0.len*a1.num%aha)%aha, 20 (((a0.val+a1.val)%aha+(a1.sum+a0.len*a1.num)%aha*a0.num%aha)%aha-a1.num*a0.sum%aha+aha)%aha, 21 (a0.num+a1.num)%aha); 22 a0=a1; 23 a1=a2; 24 //printf("len=%lld,sum=%lld,val=%lld,num=%lld\n",a2.len,a2.sum,a2.val,a2.num); 25 } 26 printf("Case #%d: %lld\n",Case,a2.val); 27 } 28 return 0; 29 }