Codeforces Round #615 (Div. 3)

C - Product of Three Numbers

题意:

将一个数分解为三个互不相同且都大于2的数。

代码

main(void)
{
	int t=read();
	while(t--)
	{
		int n=read();
		int a=1,b=1,c=1;
		for(int x=2;x*x<n;x++)
		{
			if(n%x==0)
			{
				a=x;
				break;
			}
		}
		n=n/a;
		for(int x=a+1;x*x<n;x++)
		{
			if(n%x==0)
			{
				b=x;
				c=n/x; 
				break;
			}
		}
		if(a>=2&&b>=2&&c>=2)
		{
			printf("YES\n");
			printf("%d %d %d\n",a,b,c);
		}
		else
		{
			printf("NO\n");
		}
	}
}

D - MEX maximizing

题意:

将一个数组的一些数加减x,使数组中未出现的最小数最大

分析:

一个数加减任意个x,可以看做是其模x的数加减任意个数,这样就可以将数组的结构用t%x的个数来表示。ans想要增减,必须有ans%x的数通过增减x来到达ans的位置。ans初值为0,判断ans是否可以增加,递推可得所有的ans。递推过程中,如果ans的模x的次数与数组中此模值的个数可以相抵,即数组中ans%x的个数比递推中ans经过ans%x的次数大,那么ans增加。

代码


int a[500000];
map<int,int>mp; 
main(void)
{
	int q=read();
	int x=read();
	int ans=0;
	while(q--)
	{
		int t=read();
		a[t%x]++;
		while(a[ans%x])
		{
			a[ans%x]--;
			ans++;
		}
		printf("%d\n",ans);
	}
}
posted @ 2020-08-28 20:20  王乾宇  阅读(159)  评论(0编辑  收藏  举报