【玲珑杯Round17】xjb总结

zcy真是垃圾,啥都不会的那种。

菜的不行。

这场手速上了三题,然后各种E被卡……

日个吗居然E不开栈,傻逼吧

有毒吧

来看题:

A.sqc给的我的神奇公式,gtmd居然能A?

#include<bits/stdc++.h>
using namespace std;
int n;double ans=0;
int main(){
    scanf("%d",&n);
    for(int i=1;i<n-1;i++){
        int j=(n-i)/2,k=(n-i)-(n-i)/2;
        ans=max(ans,sin(i)+sin(j)+sin(k));
    }
    printf("%.9lf
",ans);
}

B.小学生容斥,2^m次系列。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
typedef long long ll;
#define N 2
const int maxn=2005;
const int L=1<<20;
int a[maxn],T,n,m;ll f[L];int bin[L];
ll gcd(ll n,ll m){
    return m?gcd(m,n%m):n;
}
inline ll lcm(ll n,ll m){return n/gcd(n,m)*m;}
void dfs(int stp,int s,ll w){
    if (w>n) return ;
    if (stp>m) {f[s]+=n/w;return ;}
    dfs(stp+1,s<<1,w);
    dfs(stp+1,s<<1|1,lcm(w,a[stp]));
}
int main(){

    for (int i=1;i<L;i++) bin[i]=bin[i>>1]+(i&1);
    for (scanf("%d",&T);T--;) {
        memset(f,0,sizeof f);
        scanf("%d %d",&n,&m);
        for (int i=1;i<=m;i++) scanf("%d",&a[i]);
        dfs(1,0,1);ll ans=0;
        for (int j=0;j<m;j++)
        for (int i=0;i<(1<<m);i++)
        if (((i>>j)&1)==0) f[i]-=f[i+(1<<j)];
        for (int i=0;i<(1<<m);i++)
        if (bin[i]&1) ans+=f[i];
        printf("%lld
",ans);
    }
    return 0;
}

剩下就一堆不会……

Ctm烦得跟什么一样,Etm卡空间卡常数,还狗日的不开栈。

D裸FFT算下。

#include<bits/stdc++.h>
#define N 1000005
typedef long long ll;
using namespace std;
const double pi=acos(-1);
struct E{
    double x,y;
    E (double x=0,double y=0):x(x),y(y){}
}a[N];
E operator+(const E &a,const E &b){return E(a.x+b.x,a.y+b.y);}
E operator-(const E &a,const E &b){return E(a.x-b.x,a.y-b.y);}
E operator*(const E &a,const E &b){return E(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int n,m,l,q,L,nmax;
int r[N],c[N];ll ans[N];
void FFT(E *x,int k){
    for (int i=0;i<n;i++) if (i<r[i]) swap(x[i],x[r[i]]);    
    for (int i=1;i<n;i<<=1){
        E wn(cos(pi/i),sin(pi*k/i));
        for (int j=0;j<n;j+=(i<<1)){
            E w(1,0),l,r;
            for (int p=j;p<j+i;p++,w=w*wn){
                l=x[p],r=x[p+i];
                x[p]=l+w*r;
                x[p+i]=l-w*r;    
            }
        }
    }
    if (k==-1) for (int i=0;i<=n;i++) x[i].x/=n;
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int main(){
    int T=read();
    while(T--){
        n=read();q=read();m=n;nmax=0;L=0;
        memset(ans,0,sizeof(ans));memset(a,0,sizeof(a));
        for(int i=1;i<=m;i++)c[i]=read(),nmax=max(n,c[i]),a[c[i]].x++;
        nmax*=2;for (n=1;n<=nmax;n<<=1,L++);
        for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
        FFT(a,1);
        for(int i=0;i<=n;i++)a[i]=a[i]*a[i];
        FFT(a,-1);
        for(int i=1;i<=n;i++)ans[i]=(ll)(a[i].x+0.5);
        for(int i=1;i<=m;i++)ans[c[i]*2]--;
        for(int i=1;i<=n;i++)ans[i]>>=1;
        for(int i=n;i>=1;i--)ans[i]+=ans[i+1];
        for(int i=1;i<=q;i++){
            int k=read();printf("%lld
",ans[k]);
        }
    }
}

好气啊,要是知道开栈我就能rank1了

巨气。

原文地址:https://www.cnblogs.com/zcysky/p/7074476.html