mollnn

只贴自己写的题

B

猜想 设 m 为还没有被填的位置个数, k 为 数 i 被占用且第 i 个格子也被占用的 i 的个数,则答案只和 n,m,k 有关

打表找规律后 OEIS 即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;
const int mod = 1e+9+7;

int n,m,k,a[N],b[N],t[N],fr[N];

int qpow(int p,int q) {return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int inv(int p) {return qpow(p,mod-2);}

int R(int n,int k) {
    if(n-k<0 || k<=0 || k>n) return 0;
    b[0]=1;
    for(int i=1;i<=k-1;i++) b[i]=b[i-1]*(k-i)%mod*inv(i)%mod;
    int ans=0;
    for(int j=0;j<k;j++) {
        if(j%2) ans-=b[j]*fr[n-j-1]%mod;
        else ans+=b[j]*fr[n-j-1]%mod;
        ans%=mod;
        ans+=mod;
        ans%=mod;
    }
    return ans;
}

int getm() {
    int ans=0;
    for(int i=1;i<=n;i++) if(a[i]==0) ++ans;
    return ans;
}

int getk() {
    int ans=0;
    for(int i=1;i<=n;i++) {
        if(a[i]) {
            if(a[a[i]]>0) ++ans;
        }
    }
    return ans;
}

int ok() {
    int pos=0;
    for(int i=1;i<=n;i++) {
        if(a[i]==i) return 0;
        t[a[i]]=1;
        if(a[i]==0) pos=i;
    }
    int sum=0,tmp=0;
    for(int i=1;i<=n;i++) {
        sum+=t[i];
        if(t[i]==0) tmp=i;
    }
    if(sum==n-1) {
        if(tmp==pos) return 0;
    }
    return 1;
}

signed main() {
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--) {
        cin>>n;
        fr[0]=1;
        for(int i=1;i<=n;i++) fr[i]=fr[i-1]*i%mod;
        for(int i=1;i<=n;i++) cin>>a[i];
        m=getm(); k=getk();
        if(ok()) {
            cout<<R(m+1,2*m+k-n+1)<<endl;
        }
        else {
            cout<<0<<endl;
        }
    }
}

D

用 det 讨论线性方程组解的情况

#include <bits/stdc++.h>
using namespace std;

#define int long long

int T,n,m;
map<int,int> mx,my;

signed main() {
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--) {
        cin>>n>>m;
        int x[4],y[4],z,a[4][4];
        mx.clear();
        my.clear();
        for(int i=0;i<4;i++) {
            cin>>x[i]>>y[i]>>z;
        }
        if(n==1||m==1) {
            cout<<1<<endl;
            continue;
        }
        for(int i=1;i<4;i++) {
            a[i][1]=y[i]-y[0];
            a[i][2]=x[i]-x[0];
            a[i][3]=a[i][1]*a[i][2];
        }
        int det=0;
        det+=a[1][1]*a[2][2]*a[3][3];
        det+=a[1][2]*a[2][3]*a[3][1];
        det+=a[1][3]*a[2][1]*a[3][2];
        det-=a[1][1]*a[2][3]*a[3][2];
        det-=a[1][2]*a[2][1]*a[3][3];
        det-=a[1][3]*a[2][2]*a[3][1];
        if(det==0) cout<<0<<endl;
        else cout<<1<<endl;
    }
}

G

FFT 模板题

#include<bits/stdc++.h>
#define N 262145
#define pi acos(-1)
using namespace std;
typedef complex<double> E;
int n,m,L;
int A[N],B[N];
double C[N];
int R[N];
E a[N],b[N];
void fft(E *a,int f){
	for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
	for(int i=1;i<n;i<<=1){
		E wn(cos(pi/i),f*sin(pi/i));
		for(int p=i<<1,j=0;j<n;j+=p){
			E w(1,0);
			for(int k=0;k<i;k++,w*=wn){
				E x=a[j+k],y=w*a[j+k+i];
				a[j+k]=x+y;a[j+k+i]=x-y;
			}
		}
	}
}
int main(){
	scanf("%d",&n);
	m=n;
	int nn=n;
	memset(a,0,sizeof a);
	memset(b,0,sizeof b);
	for(int i=0,x;i<n;i++)scanf("%d",&x),A[i]=x,a[i]=x;
	for(int i=0,x;i<m;i++)scanf("%d",&x),B[i]=x,b[i]=1.0/(n-i);
	m=n+m;for(n=1;n<=m;n<<=1)L++;
	for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
	fft(a,1);fft(b,1);
	for(int i=0;i<=n;i++)a[i]=a[i]*b[i];
	fft(a,-1);
	for(int i=0;i<=2*nn;i++) C[i]=a[i].real()/n;
	for(int i=0;i<nn;i++) printf("%.8lf ",C[i+nn]*B[i]);
	return 0;
}

I

据说 shiftand 就可以了,然而我 T 了
转头写了个 NTT 还是被卡掉了
待填坑

分类:

技术点:

相关文章:

  • 2021-07-30
  • 2021-12-30
  • 2021-10-20
  • 2021-12-04
  • 2022-01-02
  • 2022-12-23
  • 2021-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-18
  • 2022-12-23
  • 2022-12-23
  • 2022-01-02
  • 2021-12-01
  • 2021-10-24
  • 2021-05-12
相关资源
相似解决方案