站外题求调
  • 板块学术版
  • 楼主Kastic_pd
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/4/8 13:06
  • 上次更新2023/11/5 00:53:08
查看原帖
站外题求调
307815
Kastic_pd楼主2021/4/8 13:06

QAQ题目在这

无论是打表,还是数学证明,都能得到其实求的是斐波那契数列,所以思路是直接暴力求,但数据太大,要打压位高精,普通高精会TLE。

但我打的高精挂了五十分,数据太大不好调(数据在题目的附件里),自己看又找不出BUG,求助各位dalao。

(ps:这是我第一次打压位高精,可能会有大BUG,dalao们轻点喷

这是我的代码,50分,求调:

#include<bits/stdc++.h>
using namespace std;
#define RI register int
#define ll unsigned long long
#define MAXN 12666
const int mod=100000000;
char ch[MAXN];
int n[MAXN],a[MAXN],b[MAXN],c[MAXN],t[MAXN];
int x,tt,kk,len,sk,sl;
inline bool check(){
	if(b[0]<n[0])
		return false;
	if(b[0]>n[0])
		return true;
	for(RI i=n[0];i>=1;i--){
		if(b[i]<n[i])
			return false;
		if(b[i]>n[i])
			return true;
	}
	return true;
}
inline void add(){
	x=0;
	for(RI i=1;i<=b[0];i++){
		c[i]+=(x+a[i]+b[i]);
		x=c[i]/mod;
		c[i]%=mod;
	}
	c[0]=b[0];
	if(x!=0)
		c[++c[0]]=x;
	for(RI i=1;i<=a[0];i++)
		t[i]=a[i];
	t[0]=a[0];
	for(RI i=1;i<=b[0];i++)
		a[i]=b[i];
	a[0]=b[0];
	for(RI i=1;i<=c[0];i++)
		b[i]=c[i];
	b[0]=c[0];
	memset(c,0,c[0]+10);
	return;
}
inline void print(int x[]){
	for(RI i=x[0];i>=1;i--){
		tt=0,kk=1;
		for(RI j=1;j<=8;j++){
			tt+=((x[i]%10)*kk);
			x[i]/=10;
			kk*=10;
		}
		sk=tt,sl=8;
		while(sk!=0){
			sl--;
			sk/=10;
		}
		if(i!=x[0]&&sl>0)
			while(sl--)
				printf("0");
		printf("%d",tt);
	}
	printf("\n");
	return;
}
int main(){
//	freopen("euclid.in","r",stdin);
//	freopen("euclid.out","w",stdout);
	scanf("%s",ch);
	len=strlen(ch);
	for(RI i=len-1;i>=0;i--){
		if((len-i)%8==1){
			n[0]++;
			kk=1;
		}
		n[n[0]]+=(kk*(int)(ch[i]-'0'));
		kk*=10;
	}
	a[1]=0,a[0]=1;
	b[1]=1,b[0]=1;
	while(true){
		add();
		if(check()){
			print(t);
			print(a);
			break;
		}
	}
	return 0;
}
2021/4/8 13:06
加载中...