Problem A. 卡尔的礼物
思路:两个相邻的数一定是互质。也就是说两个相邻的数只有1一个公因数。那么这个题目就迎刃而解了,要求min(c,d)>max(a,b),我们可以用比max(a,b)分别大1,2的两个数,再乘gcd(a,c),这样我们就能得到最大公因数相同,且min(c,d)>max(a,b)的c,d了。
题目的输入量很大,用scanf,printf。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//最大公因数模板
ll gcd(ll x,ll y)
{return y?gcd(y,x%y):x;
}
int main()
{int t;scanf("%d",&t);while(t--){ll a,b,c,d,t1,t2;scanf("%lld %lld",&a,&b);t1=max(a,b);t2=gcd(a,b);c=t2*(t1+1);d=t2*(t1+2);//cout<<gcd(a,b)<<" "<<gcd(c,d)<<endl;printf("%lld %lld\n",c,d);}return 0;
}
Problem B. DUEL!
题目看起来很简单,但是要分情况讨论。这里有四个边界值分别是20,30,40,60。
当n*m<40时,输出-1即可;
当40<=n*m<=60时,输出0即可;
其他的情况我们可以分以下情况讨论:
只需要特别的把30<n<40的情况分出来。
代码:
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
int main()
{IOS;scanf("%d",&t);while(t--){unsigned long long n,m,ans;scanf("%llu %llu",&n,&m);if(n*m<40) {printf("%d\n",-1);continue;}else if(n*m>=40&&n*m<=60) ans=0;else{if(n>m) swap(n,m);if(n>30&&n<40){if(m>=40&&m<=60) ans=1;else ans=2;}else if(n<=60) ans=1;if(n>60) ans=2;}printf("%llu\n",ans);}return 0;
}
Problem C. 折磨王(easy version)
思路
1 读入元素,并记录所有元素的位置
2 枚举位置,如果位置上的元素不对,就交换正确的元素过来,计数 器加 1
3 输出计数器与 k 差的绝对值
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,k,l,r;
int a[N],b[N];
int main()
{cin>>n>>k>>l>>r;int ans=0;for(int i=1;i<=n;i++){cin>>a[i];//存输入的数b[a[i]]=i;//存对应的位置}for(int i=1;i<=n;i++){if(a[i]!=i)//不在对应的位置,操作数+1,交换正确的数过来{ans++;int dis=b[i];swap(a[i],a[dis]);b[i]=i;b[a[dis]]=dis;}}cout<<abs(ans-k)<<endl;return 0;
}