比賽連結
A 樂奈吃冰
思路:
我感覺這題才是最難的,可惡,wa了好幾次,型號是OI賽制
模擬,假設有x份冰,y份熱,我們能吃min(x/2,y)份熱,但我們可以吃完所有點冰
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
void solve(){
int a,b;
cin>>a>>b;
int x=min(a/2,b);
if(x==0){
cout<<a<<endl;
return ;
}
else{
cout<<x+a<<endl;
return ;
}
}
signed main(){
int t=1;
while(t--) solve();
return 0;
}
B 素世喝茶
思路:
根據題意模擬一下,我寫的很複雜,肯定時候更簡單的思路
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
void solve(){
int n,x;
cin>>n>>x;
std::vector<int> a(n+1);
set<int> s;
int maxn=-1;
std::map<int, std::vector<int>> mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]].push_back(i);
maxn=max(maxn,a[i]);
// s.insert(a[i]);
}
int z=a[x];
// cout<<z<<endl;
sort(all(a));
if(maxn==z){
// cout<<1<<endl;
if(mp[z].size()>1){
// cout<<1<<endl;
cout<<mp[z].size()-1<<endl;
return ;
}
else{
for(int i=n;i>=1;i--){
if(a[i]!=maxn){
// cout<<a[i]<<" ";
cout<<mp[a[i]].size()<<endl;
return ;
}
}
}
}
else{
cout<<mp[a[n]].size()<<endl;
return ;
}
}
signed main(){
int t=1;
while(t--) solve();
return 0;
}
C 愛音開燈
思路:
我們找因子就可以了,但是需要注意n比x大和比x小的兩種情況
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
void solve(){
int n,x;
cin>>n>>x;
int ans=0;
for(int i=1;i<=sqrt(x);i++){
if(i>n){
break;
}
if(x%i==0){
ans++;
if(i!=(x/i)&&x/i<=n){
ans++;
}
}
}
if(ans%2){
cout<<"ON"<<endl;
return ;
}
else{
cout<<"OFF"<<endl;
return ;
}
}
signed main(){
int t=1;
while(t--) solve();
return 0;
}
D 小登做題
思路:
根據mex函式,我們可以自然而然地發現mex函式最後得到的只能是0,1,2這三個數的其中一個
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
void solve(){
int a,b,c,k;
cin>>a>>b>>c>>k;
if(k!=0&&k!=1&&k!=2&&k!=a&&k!=b&&k!=c){
cout<<-1<<endl;
return ;
}
if(k==a||k==b||k==c){
cout<<0<<endl;
return ;
}
bool ok1=false;
bool ok2=false;
bool ok0=false;
if(a==0||b==0||c==0){
ok0=true;
}
if(a==1||b==1||c==1){
ok1=true;
}
if(a==2||b==2||c==2){
ok2=true;
}
int ans=0;
if(!ok0){
ans++;
if(k==0){
cout<<ans<<endl;
return ;
}
}
if(!ok1){
ans++;
if(k==1){
cout<<ans<<endl;
return ;
}
}
if(!ok2){
ans++;
if(k==2){
cout<<ans<<endl;
return ;
}
}
cout<<ans<<endl;
return ;
}
signed main(){
int t=1;
cin>>t;
while(t--) solve();
return 0;
}
E 立希喂貓
思路:
二分+字首和
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
const int N=1e5+10;
int a[N],b[N],idx[N];
int s[N];
int s1[N];
int n;
bool check(int x,int y){
if(b[idx[x]]>y){
return false;
}
else{
return true;
}
}
void solve(){
// int n;
cin>>n;
// std::vector<int> a(n+1),b(n+1),idx(n+1);
// std::vector<int> s(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
int maxn=-1;
for(int i=1;i<=n;i++){
cin>>b[i];
maxn=max(maxn,b[i]);
}
// int maxn=-1;
for(int i=1;i<=n;i++){
idx[i]=i;
}
sort(idx+1,idx+n+1,[&](int i,int j){
return b[i]<b[j];
});
for(int i=1;i<=n;i++){
s[i]=s[i-1]+b[idx[i]]*a[idx[i]];
s1[i]=s1[i-1]+a[idx[i]];
};
// for(int i=1;i<=n;i++){
// cout<<s[i]<<" "<<s1[i]<<endl;
// }
int q;
cin>>q;
while(q--){
int x;
cin>>x;
// int ans=0;
if(x>=maxn){
cout<<s[n]<<endl;
continue;
}
int l=0;
int r=n+1;
while(l<r){
int mid=(l+r+1)/2;
// cout<<mid<<endl;
if(check(mid,x)){
// cout<<1<<endl;
l=mid;
}
else{
// cout<<2<<endl;
r=mid-1;
}
}
// cout<<l<<
cout<<s[l]+(s1[n]-s1[l])*x<<endl;
// return ;
}
return ;
}
signed main(){
int t=1;
// cin>>t;
while(t--) solve();
return 0;
}
F 祥子拆團
思路:
質因數分解+Lucas定理+插板法(組合數)
一開始我的Lucas定理寫超時了,不知道哪裡出了一些問題(後續檢視)
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define M 1000000007
int i,j,k,n,m,t;
ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;}
ll c(ll n,ll m){
if(m==0)return 1;
ll r1=1,r2=1;
for(int i=1;i<=m;i++)r1=r1*(n+1-i)%M,r2=r2*i%M;
return r1*ksm(r2,M-2)%M;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>t;
while(t--){
cin>>n>>m; ll res=1;
for(i=2;i<=40000;i++){
k=0; while(!(n%i)){n/=i; k++;}
res=res*c(m+k-1,k)%M;
}
if(n>1)res=res*m%M;
cout<<res<<'\n';
}
}