今天写了两个的,分别是:
分析(这里姑且用形容顺序)
:一个相对简单的题,但是我好久才想出了正确思路,我们很轻易就可以发现一个性质,就是当%的时候,我们一定是可以做到两组分配完成后差值为,依据这个点,我们可以把所有的分成以下四类:%,%,%,%, 第二种我们单拎出一个,所以差值为,第三组我们拎出一个,一个,所以差值也是,第四组我们拎出,差值为,结束。
:这是一个纯纯诈骗题,就是很纯粹的思维数学,的尿性。我们经过推式子可以发现推出一下式子,其中为非负整数,。显然暴力枚举是不可取的,于是我们就要找性质,我们发现在以后会重复之前的东西,所以我们只需要枚举到即可,还要注意不仅仅要 ,由于系数是,故商还要才行。
代码
:
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int n;
vector<int> v;
void solve(){
cin>>n;v.clear();
if(n==2){
cout<<1<<endl<<1<<" "<<1<<endl;
}
else if(n==3){
cout<<0<<endl<<1<<" "<<3<<endl;
}
else if(n==4){
cout<<0<<endl<<2<<" "<<1<<" "<<4<<endl;
}
else{
if(n%4==0){
cout<<0<<endl;
cout<<n/2<<" ";
for(int i=n/4+1;i<=n/4+n/2;i++){
cout<<i<<" ";
}
}
else if(n%4==1){
n--;
cout<<1<<endl;
cout<<n/2<<" ";
for(int i=n/4+1;i<=n/4+n/2;i++){
cout<<i+1<<" ";
}
}
else if(n%4==2){
n-=2;
cout<<1<<endl;
cout<<n/2+1<<" ";
cout<<1<<" ";
for(int i=n/4+1;i<=n/4+n/2;i++){
cout<<i+2<<" ";
}
}
else{
n-=3;
cout<<0<<endl;
cout<<n/2+1<<" ";
cout<<3<<" ";
for(int i=n/4+1;i<=n/4+n/2;i++){
cout<<i+3<<" ";
}
}
}
}
int main(){
int t;
t=1;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int t;
void solve(){
int n,x;
ll f;
cin>>n>>x>>f;
for(ll i=0;i<=min(2ll*n,f);i++){
ll ans=i*(i+1ll)+2ll*x;
if(ans%(2ll*n)==0 && ans/(2ll*n)>=1){
cout<<"Yes\n";
return;
}
}
cout<<"No\n";
}
int main(){
IOS
cin>>t;
while(t--) solve();
return 0;
}
完结散花!