1. 程式人生 > >【玲瓏杯Round17】xjb總結

【玲瓏杯Round17】xjb總結

etc efi its round c++ i++ read line return

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\n",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\n",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\n",ans[k]);
        }
    }
}

好氣啊,要是知道開棧我就能rank1了

巨氣。

【玲瓏杯Round17】xjb總結