zoukankan      html  css  js  c++  java
  • 0905 模拟赛

    T1

    题意

    题目链接
    (1-n)中多少个长为(m)的序列(a)满足:
    1.(a_1=1,a_m=n)
    2.(forall i,a_{i+1}ge k)
    求方案数的奇偶性,数据有(T) 组,满足:
    (n,m,q leq 10^9, Tleq 2*10^6)

    Idea

    1.考虑(k=1) 方案数为(inom{n-2}{m-2})
    2.考虑(k ot =1),即(k ge 1)
    由题意得:令所选的集合为(b_i),则对于集合里的每个数有(b_{i+1}-b_i ge k),
    那么在原集合(a_i)中不能选的数字有((m-1) imes (k-1))个, 且开头结尾不能选,那么方案数为
    (inom{n-(m-1)ast (k-1)-2}{m-2})
    (Lucas)定理得(inom{n}{m} mod p=inom{n mod p}{m mod p}ast inom{n/p}{m/p} mod p)
    (p=2:inom {n mod 2}{m mod 2})只有四种取值,且仅当((n mod 2)ge (m mod 2))
    又因(mod 2) 相当于取出该数字在二进制下的最后一位,若满足(n)的每一位都(ge m) 的每一位
    就要满足(n~and~m=m)

    Code

    int n,m,k;
    signed main(){ 
    	int T=read();
    	while(T--){
    		n=read(); m=read(); k=read();
    		int x=n-(m-1)*(k-1)-2;
    		int y=m-2;
    		if((x&y)==y) puts("Yes");
    		else puts("No");
    	}
    	return 0;
    }
    

    T2

    题目链接

    T3

    题意:

    题目链接
    随机生成一个 (m + 1) 个数的数列,第一个数为 0, 生成第 (i)个数时,在前 (i−1) 个数中等概率选择一个数 (k), 则第 (i) 个数为(k + 1)。每个数均有一个对应的权值,求数列权值和的期望。

    (S):数列的权值和

    (X_i):第i个数的权值((X_1)为定值0,所以忽略不计)

    [S=sum_{i=2}^{m+1}X_i ]

    根据期望的线性性有

    [E(S)=sum_{i=2}^{m+1}E(X_i) ]

    只要求出(E(X_i))就可以了

    (P_i(j)):序列的第i个数为j的概率

    [E(X_i)=sum_{j=1}^{i-1}P_i(j)ast a_j ]

    现在只要求出(P_i(j))就可以了

    (j)的出现要求在前(i-1)个数中随机到(j-1)

    [P_i(j)=sum_{k=1}^{i-1}frac {1}{i-1}P_k(j-1) ]

    综上所述

    [E(S)=sum_{i=2}^{m+1}sum_{j=1}^{i-1}a_j sum_{k=1}^{i-1}P_k(j-1) ]

    Code(这份和题解相符)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<string>
    #include<queue>
    #define int long long
    #define maxn 100001
    #define inf 2147483647
    #define mod 998244353
    #define eps 1e-6
    #define pi acos(-1.0)
    #define de(x) ((x)*(x))
    using namespace std; 
    inline int read(){
        int x=0,f=1; char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    int a[maxn],y[25];
    int x[25];//第i次玩的期望战斗次数 
    int p[25][25];//第i次玩的是章节j的概率  
    inline int power(int a,int b){
    	int ans=1;
    	for(;b;b>>=1){
    		if(b&1) ans=ans*a%mod;
    		a=a*a%mod;
    	}
    	return ans;
    }
    signed main(){	
    	freopen("kiseki.in","r",stdin);
    	freopen("kiseki.out","w",stdout);
    	int n=read(),m=read();
    	for(int i=1;i<=n;i++) a[i]=read();
    	for(int i=1;i<=m+1;i++) y[i]=power(i,mod-2);//逆元 
    	x[1]=0; p[1][0]=1;//序章 
    	for(int i=2;i<=m+1;i++)//第i次 
    	for(int j=1;j<i;j++){//玩的章节 
    		for(int k=1;k<i;k++)//枚举存档 
    			p[i][j]=(p[i][j]+p[k][j-1]*y[i-1]%mod)%mod;
    		x[i]=(x[i]+p[i][j]*a[j]%mod)%mod;
    	}
    	int ans=0;
    	for(int i=2;i<=m+1;i++) ans=(ans+x[i])%mod;
    	cout<<ans; 
        return 0;
    }
    
  • 相关阅读:
    设计模式开始--工厂模式
    设计模式开始--UML类之间关系表示
    设计模式开始1--不明觉厉
    Gas Station
    Validate Binary Search Tree
    Word Ladder
    (转)基于快速排序的TOPK算法
    Number of 1 Bits
    Word Search
    Rotate Array
  • 原文地址:https://www.cnblogs.com/cbyyc/p/11471530.html
Copyright © 2011-2022 走看看