zoukankan      html  css  js  c++  java
  • Codeforces Round #261 (Div. 2) C. Pashmak and Buses(思维+构造)

    题目链接
    大意:n个人,d天,每个人每天都要乘车,要求任何两个人不会d天都在同一辆车上。
    思路:转化问题,即使任意两个人d天乘车所组成的d位k进制数不同。(一列一列看)。
    然后就好写了,转化成大数加法。当前列的数为前一列加一。
    显然的d位k进制数共有kdk^d个,判断是否不小于n即可。
    细节见代码。

    #include<bits/stdc++.h>
    
    #define LL long long
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    
    using namespace std;
    
    LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
    LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
    LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
    const int N = 2e5 +11;
    int n,k,d;
    int ans[1111][1111],res[1111];
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>n>>k>>d;
    	LL s=1;
    	for(int i=1;i<=d;i++){
    		s*=k;
    		if(s>=n)break;
    	}	
    	if(s<n)cout<<-1<<endl;
    	else{
    		for(int i=1;i<=n;i++)for(int j=1;j<=d;j++)ans[i][j]=1;
    		for(int i=1;i<=d;i++)res[i]=ans[1][i]=1;
    		for(int i=2;i<=n;i++){
    			res[1]++;
    			ans[i][1]=res[1];
    		}
    		for(int i=1;i<=d;i++){
    			for(int j=1;j<=n;j++){
    				cout<<((ans[j][i]%k)==0?k:ans[j][i]%k)<<' ';
    				ans[j][i+1]+=(ans[j][i]-((ans[j][i]%k)==0?k:ans[j][i]%k))/k;
    			}
    			cout<<endl;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU4611+数学
    HDU4612+Tarjan缩点+BFS求树的直径
    HDU4602+推导公式
    HDU4607+BFS
    HDU1353+贪心
    HDU4545+LCS
    HDU4548+素数
    HDU4539+状态压缩DP
    HDU2110+母函数
    HDU1569+最大点权集
  • 原文地址:https://www.cnblogs.com/pubgoso/p/10829007.html
Copyright © 2011-2022 走看看