SMU Summer 2024 Contest Round 7

Buy an Integer
1.这题是二分答案,而不是公式拿来整除,以为是整除找了半天自己的错误,其实二分答案一发就能过。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int a,b,x;
bool check(int mid)
{
int num=0;
string s=to_string(mid);
num=s.size();
if(a*mid+b*num<=x) return 1;
return 0;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin>>a>>b>>x;
int l=0,r=1e9;
/* int ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) {
l=mid+1;
ans=mid;
}
else r=mid-1;
}
cout<<ans;*/
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
//这题这两种二分写法都可以,建议学第一个模版
}

Make Equal With Mod
1.直接每个数对3取余,这样就只有0 1 2去判断,如果三个数都相同或者只有0 2即正确,其余情况都是错误的。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define all(v) v.begin() ,v.end()
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int t;cin>>t;
while(t--)
{
int n;cin>>n;
int fla1=0,fla2=0,fla0=0;
vector<int>ve(n);
for(int i=0;i<n;i++) {
cin>>ve[i];
ve[i]%=3;
if(ve[i]==1) fla1=1;
if(ve[i]==2) fla2=1;
if(ve[i]==0) fla0=1;
}
if((fla1&&!fla2&&!fla0 )||(!fla1&&!fla2&&fla0)||(!fla1&&fla2&&!fla0)||(fla2&&!fla1&&fla0))
{
cout<<"YES";
}else cout<<"NO";
cout<<endl;
}
return 0;
}

String Formation
1.这题其实就是卡翻转的时间,那么对其处理一下就好
2.每次遇到操作2时,检查一下cnt是奇数还是偶数,如果是偶数,说明其实没有翻转,那么原来怎么插入,我们就怎么插入,如果是奇数,说明翻转了,那么我们把原来要插到前面的插到后面,原来要插到后面的同理,最后循环结束再检查一下cnt是奇数还是偶数,若为奇数翻转一下即可。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int a,b,x;
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
string s;cin>>s;
int n; cin>>n;
int fla=0,cnt=0;
while(n--)
{
int op; cin>>op;
if(op==2)
{
int x;
string c;
cin>>x>>c;
if((cnt%2==0&&x==1)||(cnt%2==1&&x==2))//没翻转按原来插,翻转了x==2才是插前面
{
s=c+s;
}else{
s+=c;
}
}else{
cnt++;
}
}
if(cnt%2==1) reverse(all(s));
cout<<s;
}

Game on Ranges
1.对于每一个d,一定是会满足存在[l,d1](l<d)[d+1,r](r>d)这样的两个区间,那么便可以遍历每个区间里的数,检查是否每个d匹配的区间是否在给定这些区间里。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void solve()
{
int n;
cin>>n;
vector mark(n+1,vector<bool>(n+1));
vector<int>l(n),r(n);
for(int i=0;i<n;i++)
{
cin>>l[i]>>r[i];
mark[l[i]][r[i]]=1;
}
for(int i=0;i<n;i++)
{
for(int j=l[i];j<=r[i];j++)
{
if((j==l[i] or mark[l[i]][j-1] )and( j==r[i] or mark[j+1][r[i]]))
//这里一定要把j==l【i】和j==r【i】写在Mark的前面,不然就会报错
//因为写在前面判断正确以后,就不会判断后面的条件,如果是边界又判断了后面的条件就会报错
{
cout<<l[i]<<" "<<r[i]<<" "<<j;
cout<<endl;
break;
}
}
}
cout<<endl;
/*
for (int i = 0; i < n; ++i) {
for (int d = l[i]; d <= r[i]; ++d) {
if ((d == l[i] or mark[l[i]][d - 1]) and (d == r[i] or mark[d + 1][r[i]])) {
cout << l[i] << ' ' << r[i] << ' ' << d << '\n';
break;
}
}
}
*/
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;cin>>t;
while(t--) solve();
}

D - Bouquet
1.在n个物品中分别选1-n种一共有2n-1种的方法,然后减掉不符合的n种选a种的数量和n种选b种的数量
2.考察卢卡斯定理的运用,即大组合数取模
3.并且注意一下负数取模的问题

/** - swj -
*
      />  フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /  ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
//----卢卡斯定理--------------
#define mod 1000000007
int n,a,b;
int qpow(int a,int n) //快速幂
{
int res=1;
while(n)
{
if(n&1) res=res*a%mod;
a=a*a%mod;
n>>=1;
}
return res;
}
int C(int n,int m)
{
if(n<m) return 0;
if(m>n-m) m=n-m;
int a=1,b=1;
for(int i=0;i<m;i++){
a=(a*(n-i))%mod;
b=(b*(i+1))%mod;
}
return a*qpow(b,mod-2)%mod;
}
int lucas(int n,int m)
{
if(m==0) return 1;
return lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod;
}
//--------------------------------------
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
//cin>>t;
while(t--) {
cin>>n>>a>>b;
int ans=qpow(2,n)-1-lucas(n,a)-lucas(n,b);
//注意负数取模的问题,不能直接(ans+mod)%mod,要一直加到大于0才取模
while(ans<0) ans+=mod;
cout<<ans%mod;
}
}

posted on   swj2529411658  阅读(10)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示