您的位置:首页 > 其它

【CQ18高一暑假前挑战赛4】标程

2018-06-06 13:57 211 查看
【二分或者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
);
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: