【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;
}

猜你喜欢

转载自www.cnblogs.com/hua-dong/p/9144760.html