A.猫猫与广告
分析
min(a,b) <= min(c,d), max(a,b) <= max(c,d)
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a,b,c,d;
cin >> a>> b >> c >> d;
if(a*b <= c * d && min(a,b) <= min(c,d) && max(a,b) <= max(c,d)) cout << "YES" << '\n';
else cout << "NO" << '\n';
return 0;
}
B.猫猫与密信
分析
找是否存在"lov",loe",lve",ove"。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
for(int i = 0;i < s.size() - 2; i++)
{
if(s[i] == 'l' && s[i+1] == 'o' && s[i+2] == 'v')
{
cout << "YES\n";
return 0;
}
if(s[i] == 'l' && s[i+1] == 'o' && s[i+2] == 'e')
{
cout << "YES\n";
return 0;
}
if(s[i] == 'l' && s[i+1] == 'v' && s[i+2] == 'e')
{
cout << "YES\n";
return 0;
}
if(s[i] == 'o' && s[i+1] == 'v' && s[i+2] == 'e')
{
cout << "YES\n";
return 0;
}
}
cout << "NO\n";
return 0;
}
c.猫猫与数列
分析
直接去模拟判断是否 <= M,用了int128。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll M = 1e18,mod = 1e9+7;
ll n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
__int128_t x = 1,cur,l,r;
int t = 2;
l = n, r = m;
while(x <= M)
{
// cout << (ll)l << ' ' << (ll)r << endl;
cur = 1;
for(int i = 0;i < r; i++)
{
cur *= l;
if(cur > M)
{
cout << t << '\n';
return 0;
}
}
t++;
l = r, r = cur;
x = cur;
}
// cout << t << '\n';
return 0;
}
D.猫猫与主人
分析
一种巧妙的思维,一般用O(n^2)是过不了的,那么怎么优化,就是猫猫满足主人的需求后,看是否主人能满足猫猫的期望,类似于双指针,比赛时想不到,还是思维不够,i枚举猫猫,j枚举猫猫当前满足主人的期望的位置,用mx值(当前位置i的猫猫满足主人期望友善值的主人们的友善值最大值)维护满足当前位置为i的猫猫的最大主人友善值,如果该值大于猫猫期望值即可记录答案,否则答案为-1,由于猫猫根据自身友善值排序,那么前一个猫猫满足的主人的期望值,当前猫猫也能满足即mx值可以拿来用,只是无法确定当前主人的友善值能否满足猫猫的期望友善值。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 200010,mod = 1e6+7;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
int ans[N];
struct Node
{
int id;
int l,r;
}host[N],cat[N];
bool cmp1(Node &a,Node &b)
{
return a.l < b.l;
}
bool cmp2(Node &a,Node &b)
{
return a.r < b.r;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for(int i = 1;i <= n; i++) cin >> cat[i].l;
for(int i = 1;i <= n; i++)
{
cin >> cat[i].r;
cat[i].id = i;
}
for(int i = 1;i <= m; i++) cin >> host[i].l;
for(int i = 1;i <= m; i++) cin >> host[i].r;
sort(cat + 1,cat + 1 + n,cmp1); //根据猫猫的友善值排序
sort(host + 1,host + 1 + m,cmp2); //根据主人的期望友善值排序
int mx = 0;
for(int i = 1,j = 1;i <= n; i++)
{
while(cat[i].l >= host[j].r && j <= m)
{
mx = max(mx,host[j].l);
j++;
}
if(mx >= cat[i].r) ans[cat[i].id] = mx;
else ans[cat[i].id] = -1;
}
for(int i = 1;i <= n; i++)
cout << ans[i] << ' ';
cout << '\n';
return 0;
}
E.猫猫与数学
分析
分情况讨论,当gcd(a,b) > 1 直接输出 0。
当gcd(a,b) = 1时,a = b,输出1。
假设a < b,gcd(a+c,b+c) > 1,根据题目样例说明,可以得知gcd(a+c,b-a),要是该值大于1。
如果b-a=1,那么如何增加,也不能使该值gcd(a+c,1)大于1
如果b-a!=1,b-a为定值,那么可以尝试枚举b-a的所有质因子,假设某个质因子为p满足的c=p - (amodp),或当np > a时,c = np - a。枚举b-a的质因子并维护c的最小值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;
ll gcd(ll a,ll b)
{
return !b ? a : gcd(b,a % b);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll a,b;
cin >> a >> b;
if(a > b) swap(a,b);
if(gcd(a,b) > 1)
{
cout << 0 << '\n';
return 0;
}
b -= a;
if(!b)
{
cout << 1 << '\n';
return 0;
}
if(b == 1)
{
cout << -1 << '\n';
return 0;
}
ll ans = 1e18;
for(ll d = 2;d <= b / d; d++)
{
if(b % d == 0)
{
ans = min(ans,d - a % d);
while(b % d == 0) b /= d;
}
}
if(b > 1)
{
ans = min(ans, b - a % b);
}
cout << ans << '\n';
return 0;
}
F.猫猫与宝石
分析
一些组合数的公式看来要了解一下。
来自常用组合数计算公式及推算_组合数公式_ccsu_deer的博客-CSDN博客
当宝石为3时,1*(++) + 2((+)+(+)+(+))+3(++) / 2^3.
观察通过一系列的手推算式得到可以发现每个系数可以变成下面形式(这推可能不容易想到)
通式
继续化简得
逆元我用得快速幂,主要是只会这个和扩展欧几里得,不太清楚题目怎么给出这种情况下2的逆元为(M+1)/2,有佬的话可以交流一下。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 998244353;
int n,m;
ll a[N];
ll qmi(ll a,ll b)
{
ll res = 1;
while(b)
{
if(b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for(int i = 1;i <= n; i++) cin >> a[i];
for(int i = 1;i <= n; i++) a[i] = (a[i] + a[i - 1]) % mod;
ll ans = 0;
for(int i = 1;i <= n; i++)
{
// ans = qmi(2,mod - 2);
ans = ((1ll * (i + 1) * a[i]) % mod * qmi(4,mod - 2)) % mod;
cout << ans << ' ';
}
return 0;
}