为什么呢?(不是调题)(解答明白了必互关)
查看原帖
为什么呢?(不是调题)(解答明白了必互关)
690561
违规用户名690561楼主2024/10/7 10:03

练习的时候做这道题,第一思路是打一个表,但是。。。

我的想法 :

将所有p(i)==1,且i不可以被表示为a * b,p(a) == 1 且 b != 1的所有i加入一个数组。若一个数能被其中任意一个数整除则这个数不能报。外层循环遍历1-1e7,内层遍历上面的含i的数组(i边找边加入),加上点小优化只拿了50.

	for(int i = 1; i <= n; i++) {
		if(p(i)) {//i是
			b[i] = true;
			f = true;
			for(int j = 1; j <= len; j++) {
				if(i % a[j] == 0) {
					f = false;
					break;
				}
			}
			if(f) {
				a[++len] = i;//i是且b==1
			}
		} else {
			f = true;
			for(int j = 1; j <= len; j++) {
				if(i % a[j] == 0) {
					f = false;
					break;
				}
			}
			if(!f) {
				b[i] = true;//i是但b>1
			} else {
				c[++len0] = i;//合法的数
			}
		}
	}

题解的做法:找到所有p(i)==1的数,将其所有倍数记录为不可报

我的疑问:我一开始想的思路是题解的那种,但我担心超时,就换了一种思路,结果。。。请问为什么我的会超时但题解的不会啊?

2024/10/7 10:03
加载中...