Bzoj2656 [Zjoi2012]数列(sequence)
Submit:?1448??Solved:?762
[Submit][Status][Discuss]
Description
???小白和小藍在一起上數(shù)學(xué)課,下課后老師留了一道作業(yè),求下面這個數(shù)列的通項公式:
?
?
?
?
?
???小白作為一個數(shù)學(xué)愛好者,很快就計算出了這個數(shù)列的通項公式。于是,小白告訴小藍自己已經(jīng)做出來了,但為了防止小藍抄作業(yè),小白并不想把公式公布出來。于是小白為了向小藍證明自己的確做出來了此題以達到其炫耀的目的,想出了一個絕妙的方法:即讓小藍說一個正整數(shù)N,小白則說出?的值,如果當(dāng)N很大時小白仍能很快的說出正確答案,這就說明小白的確得到了公式。但這個方法有一個很大的漏洞:小藍自己不會做,沒法驗證小白的答案是否正確。作為小藍的好友,你能幫幫小藍嗎?
?
Input
??????輸入文件第一行有且只有一個正整數(shù)T,表示測試數(shù)據(jù)的組數(shù)。
?????第2~T+1行,每行一個非負整數(shù)N。
?
Output
??????輸出文件共包含T行。
第i行應(yīng)包含一個不含多余前綴0的數(shù),它的值應(yīng)等于An(n為輸入數(shù)據(jù)中第i+1行被讀入的整數(shù))
【樣例輸入】
?
Sample Input
31
3
10
Sample Output
12
3
HINT
?
T<=20,N<=10^100
?
Source
?
遞歸+高精度
?
暴力遞歸只能解決10^8的問題
↑優(yōu)化高精度無果之后,覺得應(yīng)該可以找規(guī)律。
發(fā)現(xiàn)算奇數(shù)的時候,下面的偶數(shù)都算過了。
那么加個類似記憶化的東西就行
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 #define LL long long 9 using namespace std; 10 const int mxn=305; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 struct NUM{ 18 int len; 19 int a[mxn]; 20 friend NUM operator + (NUM a,NUM b){ 21 a.len=max(a.len,b.len); 22 for(int i=1;i<=a.len;i++){ 23 a.a[i]+=b.a[i]; 24 if(a.a[i]>9){ 25 a.a[i+1]+=a.a[i]/10; 26 a.a[i]%=10; 27 } 28 } 29 if(a.a[a.len+1])a.len++; 30 return a; 31 } 32 friend NUM operator / (NUM a,int b){ 33 for(int i=a.len;i;i--){ 34 a.a[i-1]+=(a.a[i]%b)*10; 35 a.a[i]/=b; 36 } 37 while(a.len>1 && !a.a[a.len]) a.len--; 38 return a; 39 } 40 }N,p,q; 41 void Debug(NUM x){ 42 for(int i=x.len;i;i--) 43 printf("%d",x.a[i]); 44 printf("\n"); 45 return; 46 } 47 void calc(NUM x){ 48 // NUM tmp; 49 if(x.len==1 && x.a[1]==1){ 50 p=x; 51 q.len=1;memset(q.a,0,sizeof q.a); 52 q.a[1]=1; 53 return; 54 } 55 calc(x/2); 56 if(x.a[1]&1)p=p+q; 57 else q=q+p; 58 // return tmp; 59 } 60 char s[mxn]; 61 int T; 62 int main(){ 63 // freopen("sequence.in","r",stdin); 64 // freopen("sequence.out","w",stdout); 65 T=read(); 66 int i,j; 67 p.len=1;p.a[1]=1; 68 q.len=1;q.a[1]=0; 69 while(T--){ 70 memset(N.a,0,sizeof N.a); 71 // 72 scanf("%s",s+1); 73 int len=strlen(s+1); 74 for(i=1;i<=len;i++){ 75 N.a[i]=s[len-i+1]-'0'; 76 } 77 N.len=len; 78 calc(N); 79 Debug(p); 80 } 81 return 0; 82 }?
轉(zhuǎn)載于:https://www.cnblogs.com/SilverNebula/p/6441684.html
總結(jié)
以上是生活随笔為你收集整理的Bzoj2656 [Zjoi2012]数列(sequence)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2 OGNL
- 下一篇: git 使用详解-- tag打标签