zoukankan      html  css  js  c++  java
  • [20191005机房测试] Seat

    有n + 2个座位等距地排成丐排,从左到右编号为0至n + 1
    初始时0号以及n + 1号座位上已经坐了一个小G,接下来会有n个小G依次找一个空座位坐下
    由于小G们坐得太近就容易互相搏弈,每个小G会找一个位置,使得离当前最近的小G距离最远
    如果有多个备选的座位,这个小G会等概率选择其中一个
    给出n,求第i个坐下的小G坐在j号座位的概率, 对P取模
    

    一看到这题就想到打表……
    其实感觉正解也不难想的样子
    但既然教练说不用改那就不改吧……emmmm
    放一下最后打出来的表
    dalao们肯定可以看出规律的!

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    ll n,mod;
    
    ll gcd(ll a,ll b)
    {
    	if(!b) return a;
    	return gcd(b,a%b);
    }
    
    struct Fenshu
    {
    	ll fm,fz;
    	Fenshu operator * (const Fenshu &a) const
    	{
    		Fenshu tmp=*this;
    		tmp.fm*=a.fm;
    		tmp.fz*=a.fz;
    		ll g=gcd(tmp.fm,tmp.fz);
    		tmp.fm/=g; 
    		tmp.fz/=g;
    		return tmp;
    	}
    }dp[1030][1030],test[5];
    
    template<class T>inline void read(T &res)
    {
    	char c;T flag=1;
    	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    	while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
    }
    
    ll qpow(ll n,ll k)
    {
    	ll res=1;
    	while(k)
    	{
    		if(k&1) res=(res*n)%mod;
    		n=(n*n)%mod;
    		k>>=1;
    	}
    	return res;
    }
    
    ll inv(ll x) {return qpow(x,mod-2);}
    
    int main()
    {
    	freopen("seat.in","r",stdin);
    	freopen("seat.out","w",stdout);
    	read(n);read(mod);
    	if(n==1)
    	{
    		puts("1");
    		return 0;
    	}
    	else if(n==2)
    	{
    		ll ans=inv(2);
    		for(register int i=1;i<=2;++i) printf("%lld ",ans);
    		puts("");
    		for(register int i=1;i<=2;++i) printf("%lld ",ans);
    		return 0;
    	}
    	else if(n==3)
    	{
    		puts("0 1 0");
    		ll ans=inv(2);
    		cout<<ans<<" 0 "<<ans<<endl;
    		cout<<ans<<" 0 "<<ans<<endl;
    	}
    	else if(n==4)
    	{
    		ll two=inv(2);
    		ll thr=inv(3);
    		ll six=inv(6);
    		cout<<"0 "<<two<<" "<<two<<" 0"<<endl;
    		cout<<thr<<" "<<six<<" "<<six<<" "<<thr<<endl;
    		cout<<thr<<" "<<six<<" "<<six<<" "<<thr<<endl;
    		cout<<thr<<" "<<six<<" "<<six<<" "<<thr<<endl;
    	}
    	else if(n==5)
    	{
    		ll two=inv(2);
    		ll fou=inv(4);
    		cout<<"0 0 1 0 0"<<endl;
    		for(register int i=1;i<=4;++i)
    			cout<<fou<<" "<<fou<<" 0 "<<fou<<" "<<fou<<endl;
    	}
    	else if(n==6)
    	{
    		ll two=inv(2);
    		ll fou=inv(4);
    		ll eig=inv(8);
    		cout<<"0 0 "<<inv(2)<<" "<<inv(2)<<" 0 0"<<endl;
    		cout<<"0 "<<inv(2)<<" 0 0 "<<inv(2)<<" 0"<<endl;
    		for(register int i=1;i<=4;++i)
    			cout<<inv(4)<<" "<<inv(8)<<" "<<inv(8)<<" "<<inv(8)<<" "<<inv(8)<<" "<<inv(4)<<endl;
    	}
    	else if(n==7)
    	{
    		ll two=inv(2);
    		ll fou=inv(4);
    		ll eig=inv(8);
    		cout<<"0 0 0 1 0 0 0"<<endl;
    		cout<<"0 "<<two<<" 0 0 0 "<<two<<" 0"<<endl;
    		cout<<"0 "<<two<<" 0 0 0 "<<two<<" 0"<<endl;
    		for(register int i=1;i<=4;++i)
    		cout<<fou<<" 0 "<<fou<<" 0 "<<fou<<" 0 "<<fou<<endl;
    	}
    	else if(n==8)
    	{
    		ll two=inv(2);
    		ll thr=inv(3);
    		ll six=inv(6);
    		ll twl=inv(12);
    		ll fiv=inv(5);
    		ll twe=inv(20);
    		ll ten=inv(10);
    		cout<<"0 0 0 "<<two<<" "<<two<<" 0 0 0"<<endl;
    		cout<<"0 "<<thr<<" "<<six<<" 0 0 "<<six<<" "<<thr<<" 0"<<endl;
    		cout<<"0 "<<5*twl%mod<<" "<<twl<<" 0 0 "<<twl<<" "<<5*twl%mod<<" 0"<<endl;
    		for(register int i=1;i<=5;++i)
    			cout<<fiv<<" "<<twe<<" "<<3*twe%mod<<" "<<ten<<" "<<ten<<" "<<3*twe%mod<<" "<<twe<<" "<<fiv<<endl;
    	}
    	else if(n==9)
    	{
    		ll fou=inv(4);
    		ll six=inv(6);
    		ll twl=inv(12);
    		cout<<"0 0 0 0 1 0 0 0 0"<<endl;
    		cout<<"0 "<<fou<<" "<<fou<<" 0 0 0 "<<fou<<" "<<fou<<" 0"<<endl;
    		cout<<"0 "<<fou<<" "<<fou<<" 0 0 0 "<<fou<<" "<<fou<<" 0"<<endl;
    		for(register int i=1;i<=6;++i)
    			cout<<six<<" "<<twl<<" "<<twl<<" "<<six<<" 0 "<<six<<" "<<twl<<" "<<twl<<" "<<six<<endl;
    	}
    	else if(n==10)
    	{
    		ll two=inv(2);
    		ll fou=inv(4);
    		ll sev=inv(7);
    		ll esb=inv(28);
    		ll xxx=(3*esb)%mod;
    		ll sss=inv(14);
    		cout<<"0 0 0 0 "<<two<<" "<<two<<" 0 0 0 0"<<endl;
    		cout<<"0 0 "<<two<<" 0 0 0 0 "<<two<<" 0 0"<<endl;
    		cout<<"0 "<<fou<<" "<<fou<<" 0 0 0 0 "<<fou<<" "<<fou<<" 0"<<endl;
    		for(register int i=1;i<=7;++i)
    			cout<<sev<<" "<<xxx<<" "<<esb<<" "<<sev<<" "<<sss<<" "<<sss<<" "<<sev<<" "<<esb<<" "<<xxx<<" "<<sev<<endl;
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    Centos6.6部署Redis集群
    贪心算法解+-字符串
    水题记录--排序
    项目总结之HashMap问题
    水题记录--大整数求阶乘
    水题记录--组合数
    水题记录-成绩转换
    水题记录
    简单排序
    数组
  • 原文地址:https://www.cnblogs.com/tqr06/p/11625497.html
Copyright © 2011-2022 走看看