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
");
printf("%d %d %d
",a,b,c);
}
else
{
printf("NO
");
}
}
}
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
",ans);
}
}