北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(2)题解

北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(2)题解,第1张

xsyの末日!

按照题意直接模拟即可

当n大于10时,输出q

n小于10时,输出

signed main()
{
  int n,q;
  scanf("%lld%lld",&n,&q);
  if(n>=10) printf("%lld\n",q);
  else printf("%lld\n",q+100*(10-n));
  return 0;
}
B 今天猛犸不上班

求数字n在k进制下的位数

其实就是看n除k可以除几次除成0呗

比如10000在十进制是五位数,那就可以除五次十

代码如下

signed main() {
    int n,k,ans=0;
    cin>>n>>k;
    while(n) {
        n/=k;
        ans++;
    }
    cout<
C 你干嘛 哈哈嗨呦

这道题其实仔细看题面就能发现简单的解法

位置数和n只有100个,我们可以直接暴力每一个位置,在取min就好了

代码如下

const int N=105;
int a[N];
int main() {
    int n,ans=1e9;
    scanf("%d",&n);
    for(int i=0,x;i
D 重生之我是菜狗

题意可以抽象为,从n只中选x只,不能选a只或b只

大家知道,从n只中选i只,答案为种,排除不选,也就是

不能选a只或b只,就从答案中减去 和

代码如下

const int N=3e5+10;
const int mod=1e9+7;
int qpow(int x,int y) {
    int ans=1;
    while(y) {
        if(y&1) ans=ans*x%mod;
        y>>=1;
        x=x*x%mod;
    }
    return ans;
}
void add(int &x,int y) {
    x+=y;
    if(x>=mod) x-=mod;
    if(x<0) x+=mod;
}
signed main() {
    int n,a,b;
    cin>>n>>a>>b;
    int ans=qpow(2,n),s=1;
    add(ans,-1);
    for(int i=1;i<=b;i++) {
        s=1LL*s*(n-i+1)%mod,s=1LL*s*qpow(i,mod-2)%mod;
        if(i==a) add(ans,-s);
        if(i==b) add(ans,-s);
    }
    cout<
E 这隔离点网太烂了!

比较复杂的排列组合

分开考虑有没有房间人数为0

1.没有房间为0的移法

2.有且只有一个房间为0的移法

3.超过一个房间为0的移法

将n个人分到n-i的房间   可以这样计算  

n个人之间可放入n-1个隔板,因要分成n-i份,需要插入n-i-1个隔板

=

选出i个房间空出来,选法有

所以对于每一个空出房间数i,有

总的答案为

代码如下

const int N=3e5+10;
const int mod=1e9+7;
int f[N],inv[N];
int qpow(int a,int b){
	int ret=1;
	while(b){
		if(b&1)ret=ret*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ret;
}
int C(int n,int m){
	int ans;
	ans=f[n]*inv[n-m]%mod*inv[m]%mod;
	return ans;
}
signed main(){
	int n,k,i,ans=0;
	cin>>n>>k;

	f[0]=1;
	for(i=1;i<=n;i++)f[i]=f[i-1]*i%mod;
	for(i=0;i<=n;i++)inv[i]=qpow(f[i],mod-2)%mod;
    //预处理大组合数

	k=min(k,n-1);
	for(i=0;i<=k;i++)
		ans=(ans+C(n,i)*C(n-1,i)%mod)%mod;
	cout<
F 计信狗的大一下

题目要求

我们可以转化一下求总数减去和a[i+1]%m" src="https://latex.codecogs.com/gif.latex?a%5Bi%5D%25m%3Ea%5Bi+1%5D%25m" />的

可以先将di对m取模,这样di是一个小于m的数。

根据公式,可以可以推出如下表达式 

第二类的具体推到过程

要使得a_{i+1}%m" src="https://latex.codecogs.com/gif.latex?a_%7Bi%7D%25m%3Ea_%7Bi+1%7D%25m" />

因为0" src="https://latex.codecogs.com/gif.latex?d%3E0" />

a_{i}" src="https://latex.codecogs.com/gif.latex?a_%7Bi+1%7D%3Ea_%7Bi%7D" />

有\left \lfloor \frac{a_{i}}{m} \right \rfloor" src="https://latex.codecogs.com/gif.latex?%5Cleft%20%5Clfloor%20%5Cfrac%7Ba_%7Bi+1%7D%7D%7Bm%7D%20%5Cright%20%5Crfloor%3E%5Cleft%20%5Clfloor%20%5Cfrac%7Ba_%7Bi%7D%7D%7Bm%7D%20%5Cright%20%5Crfloor" />

又因

所以我们可以从a0开始递推到an-1

int d[5005],zero[5005];//zero[i]累计di=0个数 
int a[5005];//a[i]累计d
signed main()
{
	int k,q;
    cin>>k>>q;
	for(int i=0;i>d[i];
	while(q--)
	{
		int n,x,m,sum,sumzero,sumn;
		cin>>n>>x>>m;
		x%=m;a[0]=0;zero[0]=0; 
		for(int i=0;i

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2991551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)