A A-characteristic
思路:简简单单构造题,把1和-1分开来考虑就好。
#include<bits/stdc++.h>
using namespace std;
int t,n,k,cnt;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k; cnt=0;
int a=0;
for(int i=0;i<=n;i++)
{
if(k==((i*(i-1)/2)+(n-i)*(n-i-1)/2))
{
cout<<"YES\n";
for(int j=1;j<=i;j++)
{
cout<<"1 ";
}
for(int j=i+1;j<=n;j++)
{
cout<<"-1 ";
}
cout<<"\n";
cnt=1; break;
}
}
if(cnt==0) cout<<"NO\n";
}
return 0;
}
B Sort with Step
思路:只能间隔k来交换,意味着应该把每间隔为k的数分成一组,并且由于它是一个排列,所以每一组的数都是定好的。for循环一遍找出每个位置上的数是不是在该位置所在的组就好了。
#include<bits/stdc++.h>
using namespace std;
int t,n,k,a[200010];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
int ans=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
if((a[i]-i)%k!=0) ans++;
}
if(ans==0) cout<<"0\n";
if(ans==2) cout<<"1\n";
if(ans>2) cout<<"-1\n";
}
return 0;
}
C Strongly Composite
思路:这题的技巧性比较强,卡了我时间。但是收获也比较多。
1.对一个数分解质因数不需要写质数筛。因为把前面质因数分解后,该数包含的最小质因数就一直在缩小。
2.为了防止每次memset,用vector可以减小时间复杂度
3.一个数在sqrt(n)分解后还是没有质因数,说明它是一个质数(先循环再特判)
#include<bits/stdc++.h>
using namespace std;
int t,n,a[1010],ans,ss;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
vector <int> v;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
for(int j=2;j*j<=x;j++)
{
while(x%j==0)
{
v.push_back(j);
x/=j;
}
}
if(x>1)//·Ö½âÍêÊ£Ò»¸ö´óÓÚsqrt(n)µÄÖÊÊý»òÕßÊ£Ëü±¾Éí
{
v.push_back(x);
}
}
sort(v.begin(),v.end());
if(v.size() == 1)
{
cout << "0\n";
continue;
}
if(v.size() == 2)
{
if(v[0] != v[1])
{
cout << "0\n";
}else
{
cout << "1\n";
}
continue;
}
int ans = 0, num = 1, kind = 0;
for(int i = 1; i < (int)v.size(); i++)
{
if(v[i] == v[i - 1])
{
num++;
}else
{
ans += num / 2;
if(num % 2 == 1)kind++;
num = 1;
}
// cout << i << ' ' << num << ' ' << kind << endl;
}
ans += num / 2;
if(num % 2 == 1)kind++;
num = 1;
// cout << ans << ' ' << kind << '\n';
cout << ans + kind / 3 << '\n';
}
return 0;
}