30分,7个点TLE,求调
  • 板块P1621 集合
  • 楼主KatsuraJiu
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/31 00:50
  • 上次更新2025/1/31 18:23:38
查看原帖
30分,7个点TLE,求调
1576696
KatsuraJiu楼主2025/1/31 00:50

我的想法是依次对每一个数字做质因数分解,在这个过程中,记录每一个质数第一次出现时,对应的数,例如输入10 20 3;第一次出现5对应10,3对应12,那么后续的比如15分解得到3、5,就检索发现质数记录表上,3对应12,就将12与15合并;5对应10,就将15与10合并。这个就是我的主要思路,超时了七个点,这个思路可以做时间上的优化吗?还是说直接换一个思路处理

# include <stdio.h>

int zhi[100005] = { 0 };

void qiuzhi(int x, int a[], int q);
void union_ (int x,int y,int a[]);

int main()
{
	int a, b, q;
	int i;
	int ans = 0;
	int x[100005] = { 0 };

	scanf("%d %d %d", &a, &b, &q);

	for (i = a; i <= b; i++) {
		x[i] = -1;
		qiuzhi(i,x,q);
	}

	for (i = a; i <= b; i++) {
		if (x[i] == -1) {
			ans++;
		}
	}

	printf("%d", ans);

	return 0;
	
}

void qiuzhi(int x,int a[],int q) 
{
	int i;
	int m;
	int y=x;
	int zh[1000] = { 0 };

	for (i = 2; i  <= y; i++) {

		if (y % i == 0) {
			if (i >= q) {
				if (zhi[i] == 0) {
					zhi[i] = x;
				}
				else {
					m = zhi[i];
					if(a[x]==-1){
						a[x] = m;
					}else{
						while(a[x]!=-1){
							x=a[x];
						}
						a[x]=m;
					}
				}
			}
		}

		while (y % i == 0) {
			y = y / i;
		}
	}
}
2025/1/31 00:50
加载中...