A - 铅氘蹄 CodeForces - 1389A
题意:
给l和r 求ab 并且a和b的最小公倍数也在l 到r 的区间中
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
ll n, m, t, l, r;
ll a[maxn], b[maxn];
int main()
{
cin >> t;
while(t --)
{
cin >> l >> r;
if(l*2 > r)
{
cout << "-1 -1" << endl;
}
else
{
cout << l << " " << l*2 << endl;
}
}
return 0;
}
C - 铅氘蹄2
题意:给图形,问有几个竖着菱形块
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, n;
int main()
{
cin >> t;
while(t --)
{
cin >> n;
cout << n << endl;
}
return 0;
}
H - B王徐书记(铅氘蹄3)
题意: 给一个数字,可以除他的因子,或者减一,问最少几步变成1
题解 : 偶数的话先变成2 然后减一, 奇数的话减一变成偶数, 1,2,3特判
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int t, n;
int main()
{
cin >> t;
while(t --)
{
cin >> n;
if(n == 1) cout << 0 << endl;
else
if(n == 2) cout << 1 << endl;
else
if(n == 3) cout << 2 << endl;
else
if(n%2 == 0) cout << 2 << endl;
else cout << 3 << endl;
}
return 0;
}
B - jpdl的一眼题
题意: 给n长度的a数组, m长度的b数组,求一个数组要求
c1 = gcd(a1+b1, a2+b1,a3+b1,。。。an+b1);
c2 = gcd(a1+b2, a2+b2,a3+b2,。。。an+b2);
c3 = gcd(a1+b3, a2+b3,a3+b3,。。。an+b3);
…
cm = gcd(a1+bm, a2+bm,a3+bm,。。。an+bm);
题解:
辗转相减法 gcd(a,b)=gcd(b,a−b)
辗转相除法 gcd(a,b)=gcd(b,a%b)
a数组的变化可以理解为 gcd(a1+d, a2+d,a3+d,a4+d…an+d);
由于辗转相减法 可以变成
gcd(a1+d, a2-a1, a3-a2, a4-a3…an-a(n-1));
所以我们可以预先处理出来gcd(a2-a1,a3-a2,a4-a3…an-a(n-1))
之后可以用n的复杂度将b的每个元素遍历一次,取个gcd即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
ll n, m;
ll a[maxn], b[maxn];
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= m; i ++) cin >> b[i];
ll gcd = 0;
for(int i = 2; i <= n; i ++) gcd =__gcd(gcd, a[i]-a[i-1]);
for(int i = 1; i <= m; i ++) cout << abs(__gcd(a[1]+b[i],gcd)) << " ";
cout << endl;
return 0;
}