比赛 20161115 评测结果 AAAAAWWWWW
题目名称 军队 最终得分 50
用户昵称 jinqiu 运行时间 0.376 s
代码语言 C++ 内存使用 65.55 MiB
提交时间 2016-11-15 11:18:55
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int maxn = 1e5 + 10;
const int prime[170] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
int n, m ,ans;
int a[maxn];
int factor[maxn][170];
bool judge[1000];

int read();
void work();
void get_factor();

int main() {
	freopen("tarmy.in", "r", stdin);
	freopen("tarmy.out", "w", stdout);
	int i, j;
	n = read(); m = read();
	for(i = 1; i <= n; i++)
		a[i] = read();
	get_factor();
	work();
	cout << ans << "\n";
	return 0;
}

void work() {
	int i, j, k;
	for(i = 1; i <= n; i++) {
		memset(judge, false, sizeof(judge));
		for(k = 1; k <= factor[i][0]; k++)
			judge[factor[i][k]] = true;
		int tmp = 1;
		long long sum = a[i];
		for(j = i + 1; j <= n; j++) {
			bool flag = true;
			for(k = 1; k <= factor[j][0]; k++) {
				if(!judge[factor[j][k]])
					judge[factor[j][k]] = true;
				else {
					flag = false;
					break;
				}
			}
			if(flag) {
				tmp++;
				sum += a[j];
			}
			else {
				if(sum >= m && tmp >= ans)
					ans = tmp;
				break;
			}
		}
	}
}

void get_factor() {
	int i, j;
	bool judge[1010];
	for(i = 1; i <= n; i++) {
		j = 0;
		int tmp = (int)((double)sqrt(a[i] + 1));
		int now = a[i];
		while(prime[j] <= tmp) {
			if(now % prime[j] == 0){
				factor[i][++factor[i][0]] = prime[j];
				while(now % prime[j] == 0)
					now /= prime[j];
			}
			j++;
		}
		if(now != 1) 
			factor[i][++factor[i][0]] = now;
	}
}

int read() {
	char s = getchar();
	int t = 0, f = 1;
	while(s < '0' || s > '9') {
		if(s == '-')f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9') {
		t = (t << 3) + (t << 1) + s - '0';
		s = getchar();
	}
	return t*f;
}