【CQ18高一暑假前挑战赛4】标程
【二分或者STL】
二分:
#include<bits/stdc++.h> using namespace std; const int maxn=1000010; int a[maxn]; int main() { int K,N,i,cnt=0,pos; scanf("%d%d",&K,&N); for(i=1;i<=N;i++) scanf("%d",&a[i]); sort(a+1,a+N+1); for(i=1;i<=N;i++){ pos=lower_bound(a+1,a+N+1,K-a[i])-a; if(pos>i&&a[pos]==K-a[i]) printf("%d %d\n",a[i],K-a[i]),cnt++; } if(cnt==0) puts("No Solution"); return 0; }
set:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<set> using namespace std; int k,n,a[50005],s,q,flag; set<int>st; int main() { flag=0; cin>>k>>n; for(int i=1;i<=n;i++) { scanf("%lld",&s); a[i]=s; st.insert(s); } sort(a+1,a+1+n); set<int>::iterator j; for(int i=1;i<=n;i++) { q=k-a[i]; j=st.find(q); if(j==st.end()) continue; else{ if(*j>a[i]) { flag=1; printf("%d %d\n",a[i],*j); } } } if(flag==0) puts("No Solution"); return 0; }
【B:贪心题】
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1010; int a[maxn]; int main() { int N,i,j; ll ans=0; scanf("%d",&N); for(i=1;i<=N;i++) scanf("%d",&a[i]); sort(a+1,a+N+1); for(i=1;i<=N;i++) a[i]+=a[i-1],ans+=a[i]; printf("%lld\n",ans); return 0; }
【C:暴力】
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; ll sum[maxn]; bool check(int x) { if(x%7==0) return true; while(x){ if(x%10==7) return true; x/=10; } return false; } void solve() { for(int i=1;i<maxn;i++){ sum[i]=sum[i-1]; if(!check(i)) sum[i]+=(ll)i*i; } } int main() { solve(); int T,N; scanf("%d",&T); while(T--){ scanf("%d",&N); printf("%lld\n",sum[N]); } return 0; }
【D:欧拉函数】
#include<bits/stdc++.h> #define ll long long using namespace std;
ll ans; ll getphi(int x) { int res=x; for(int i=2;i*i<=x;i++){ if(x%i==0){ res=res/i*(i-1); while(x%i==0) x/=i; } } if(x>1) res=res/x*(x-1); return res; } int main() { int N; scanf("%d",&N); for(int i=1;i*i<=N;i++){ if(N%i==0) { ans+=getphi(N/i)*i; if(i*i!=N) ans+=getphi(i)*(N/i); } } printf("%lld\n",ans); return 0; }
【E:容斥】
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=500000; int p[maxn+10],cnt; short int vis[maxn+10],mu[maxn+10]; void read(int &x){ x=0; char c=getchar(); while(c>'9'||c<'0') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar(); } void Put(ll x) { if(x>9) Put(x/10); putchar(x%10+'0'); } void prime() { mu[1]=1; for(int i=2;i<=maxn;i++){ if(!vis[i]) p[++cnt]=i,mu[i]=-1; for(int j=1;j<=maxn&&i*p[j]<=maxn;j++){ vis[i*p[j]]=1; mu[i*p[j]]=-mu[i]; if(i%p[j]==0) { mu[i*p[j]]=0; break; } } } } int a[200010],num[maxn+10];ll ans; vector<int>G[maxn+10]; int main() { prime(); int N,Q,x,i,j,Max=0; scanf("%d%d",&N,&Q); for(i=1;i<=N;i++) read(a[i]),Max=max(Max,a[i]),vis[i]=0; for(i=1;i<=Max;i++){ for(j=i;j<=Max;j+=i) G[j].push_back(i); } while(Q--){ read(x); int L=G[a[x]].size(); if(vis[x]==1){ for(i=0;i<L;i++) num[G[a[x]][i]]--; for(i=0;i<L;i++) ans-=mu[G[a[x]][i]]*num[G[a[x]][i]]; } else { for(i=0;i<L;i++) ans+=mu[G[a[x]][i]]*num[G[a[x]][i]]; for(i=0;i<L;i++) num[G[a[x]][i]]++; } vis[x]=vis[x]^1; Put(ans); puts(""); } return 0; }
It is your time to fight!