比赛 20161115 评测结果 AWWWWWWWWW
题目名称 军队 最终得分 10
用户昵称 Ostmbh 运行时间 0.044 s
代码语言 C++ 内存使用 1.46 MiB
提交时间 2016-11-15 11:55:57
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long s[100010]={0};
int A[100010]={0};
struct BIG{
	int C[50];
	int len;
	BIG(){
		memset(C,0,sizeof(C));
		len=0;
	};
	bool operator > (const BIG& c) const {
		if(len!=c.len)
			return len>c.len;
		for(int i=len;i>=1;i--)
			if(C[i]!=c.C[i])
				return C[i]>c.C[i];
		return false;
	}
	BIG operator * (const BIG& b) const {
		BIG c;
		int x;
		for(int i=1;i<=len;i++){
			x=0;
			for(int j=1;j<=b.len;j++){
				c.C[i+j-1]+=b.C[j]*C[i]+x;
				x=c.C[i+j-1]/10;
				c.C[i+j-1]%=10;
			}
			c.C[i+b.len]=x;
		}
		c.len=40;
		while(c.C[c.len]==0&&c.len>1)
			c.len--;
		return c;
	}
	BIG operator /(const int& b)const{
		BIG c;
		c.len=40;
		long long d=0;
		for(int i=len;i>=1;i--){
			d=d*10+C[i];
			c.C[i]=d/b;
			d%=b;
		}
		while(c.C[c.len]==0&&c.len>1)
			c.len--;
		return c;
	}
	int operator %(const int& b)const{
		long long n=0;
		for(int i=len;i>=1;i--){
			n=n*10+C[i];
			n%=b;
		}
		return n;
	}
};
BIG tran(int b){
	BIG c;
	int i=1;
	while(b>0){
		c.C[i++]=b%10;
		b/=10;
	}
	c.len=i-1;
	return c;
}
inline void read(int &x){
	x=0;
	char c=getchar();
	bool flag=0;
	while(c<'0'||c>'9'){
		if(c=='-')
			flag=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	if(flag)
		x=-x;
}
BIG zero=tran(0);
BIG one=tran(1);
inline int gcd(int a,int b){
	if(!b)
		return a;
	return gcd(b,a%b);
}
BIG sum=one;
inline int ggcd(BIG x,int c){
	int cls=x%c;
	if(cls==0)
		return c;
	else return gcd(c,cls);
}
int main(){
	freopen("tarmy.in","r",stdin);
	freopen("tarmy.out","w",stdout);
	int n,k;
	int ans=0;
	read(n),read(k);
	for(int i=1;i<=n;i++){
		read(A[i]);
		s[i]=s[i-1]+A[i];
	}
	int l=1,r=1;
	sum=sum*tran(A[1]);
	for(;r>=l;){
		if(r!=n)
			while(ggcd(sum,A[r+1])==1&&s[r]-s[l-1]<k){
				r++;
				sum=sum*tran(A[r]);
				if(r==n)
					break ;
			}
		if(r-l+1>ans&&s[r]-s[l-1]>=k)
			ans=r-l+1;
		if(r!=n)
			while(ggcd(sum,A[r+1])==1){
				if(r-l+1>ans&&s[r]-s[l-1]>=k)
					ans=r-l+1;
				r++;
				sum=sum*tran(A[r]);
				if(r==n)
					break;
			}
		if(r-l+1>ans&&s[r]-s[l-1]>=k)
			ans=r-l+1;
		l++;
		sum=sum/A[l-1];
	}
	printf("%d\n",ans);
return 0;
}