玲珑杯Round17xjb总结
Posted zcysky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玲珑杯Round17xjb总结相关的知识,希望对你有一定的参考价值。
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了
巨气。
以上是关于玲珑杯Round17xjb总结的主要内容,如果未能解决你的问题,请参考以下文章