Computer Transformation UVA - 1647 (C++大数模拟)

import java.math.*;
import java.util.*;
/*
 * 思路:
 * 数列是 0 1 1 3 5 11 21 43
 * 然后从第三项开始*2+1,*2-1,*2+1,*2-1,一直这么运算下去
 * 发现题解竟然是 a[i]=a[i-1]+2*a[i-2],这个更具通用性
 * 做法:
 * 递推要记住预处理,要不然有点浪费
 * 
 */
public class Main {
	public static void main(String []args) {
		BigInteger []arr=new BigInteger[1010];
		arr[1]=BigInteger.valueOf(0);
		arr[2]=arr[3]=BigInteger.valueOf(1);
		for(int i=4;i<=1000;i++) {
			if(i%2==1)arr[i]=arr[i-1].multiply(BigInteger.valueOf(2)).subtract(BigInteger.valueOf(1));
			else arr[i]=arr[i-1].multiply(BigInteger.valueOf(2)).add(BigInteger.valueOf(1));
		}
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext()) {
			int n=cin.nextInt();
			System.out.println(arr[n]);
		}
	}
	
}
#include<bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)

int mi[1010][100];
int ans[1010][100];
/*
C++分段模拟
通项:a[n]=a[n-2]+2^(n-3)
*/

void init(){
    mi[0][0]=1;//
    ans[2][0]=1;
    rep(i,3,1000+1){
        rep(j,0,100){
            mi[i-2][j] +=mi[i-3][j]+mi[i-3][j];//前一项相对位置*2
            ans[i][j]+=ans[i-2][j]+mi[i-3][j];

            mi[i-2][j+1] +=mi[i-2][j]/10000; mi[i-2][j]%=10000;
            ans[i][j+1]+=ans[i][j]/10000;ans[i][j]%=10000;
        }
    }
}

int main(){
    init();
    int n;
    while(scanf("%d",&n)==1){
        int index=99;
        while(index>0&&!ans[n][index])index--;

        //这两句话很牛逼
        printf("%d",ans[n][index--]);
        while(index>=0)printf("%04d",ans[n][index--]);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/81325350