2019年燕山大学大学生程序设计大赛(二)

简单数学题

“我读了,一发A了,有什么好说的。”“你个彩笔。”机房又传来FT训斥Codeoos的声音。美丽的女孩Codeoos对此感到很委屈。原来,Codeoos遇到一道数学题,她做不出来。但是厉害的FT一眼就秒了!这道数学题是这样的:
在这里插入图片描述
输入样例:

3
1
10000
10

输出样例:

1
661912
242110
参考代码
/*
取模性质:a*b%m=((a%m)*(b%m))%m
对于mod=996251,当m>=mod时 有 m!%mod=0;
输入数据有多组,打表即可
*/
#include<iostream>
#include<algorithm>
#include <set>
#include <string>
#include <cstdio>
using namespace  std;

const int maxn = 996251;
long long a[maxn];
long long b[maxn];

int main(){
	int t,inx=0;
	long long c;
	a[0]=1;
	b[0]=1;
	for(int i=1;i<maxn;++i){
		a[i]=(a[i-1]*i)%maxn;
		b[i]=(b[i-1]*a[i])%maxn;
	}
	cin>>t;
	while(t--){
		cin>>c;
		if(c>=maxn)cout<<"0\n";
		else cout<<b[c]%maxn<<endl;
	}
}

滑稽数

最近大恶人了解到一种特殊的数字,他称这种数字为滑稽数。

如果一个数的二进制表示由k+1个连续的1和k个连续的0组成,那么这个数被称为滑稽数。 下面是一些滑稽数的例子:
在这里插入图片描述
输入样例:

992

输出样例:

496
参考代码
/*
先把一定范围的内的滑稽数求出来,然后对于n,从大到小判断,是否整除n
*/
#include<iostream>
#include<algorithm>
#include <set>
#include <string>
#include <cstdio>
using namespace  std;

int main(){
	int a[10];
	int t;
	int c=1;
    int b[20]={1};
	for(int i=1;i<20;++i)b[i]=b[i-1]*2;
	for(int i=1;i<10;++i)a[c++]=(b[i]-1)*(b[i-1]);
	cin>>t;
	for(int i=9;i>=1;--i){
		if(t%a[i]==0){
			cout<<a[i]<<endl;
			break;
		}
	}
}

An easy problem

一天小明正在各种OJ中流窜,突然一头奶牛把小明撞飞,小明被狠狠地撞到一棵树上,这棵树上有n个点,n−1条边,每个节点上都有一个数,规定两个节点之间的距离为这两个节点的路径上的所有节点上的数的异或和,小明必须选出最大的异或和才能离开这棵树。

小明觉得这个问题非常复杂无能狂怒起来,于是这棵树害怕了,退化成一条链使这个问题变得简单起来。
在这里插入图片描述
输入样例:

5
1 2 3 4 5

输出样例:

7

提示:[3,4]的异或和最大,所以答案为7

参考代码
/*
用0/1字典树解决异或问题
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int pre[maxn],n,d;
int tree[32*maxn][2],pos;
int a[32*maxn];

void insert(int x,int p){
    int root = 0,b;
    for(int i=31;i>=0;--i){
        b = (x>>i)&1;
        if(!tree[root][b])tree[root][b]=++pos;
        root = tree[root][b];
    }
    a[root]=p;
}

int query(int x){
    int root = 0,b;
    for(int i=31;i>=0;--i){
        b = (x>>i)&1;
        if(tree[root][b^1])root=tree[root][b^1];
        else root = tree[root][b];
    }
    return a[root];
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&d);
        pre[i]=pre[i-1]^d;
    }
    insert(pre[0],0);
    int ans=0;
    for(int i=1;i<=n;++i){
        d=query(pre[i]);
        ans=max(ans,pre[i]^pre[d]);
        insert(pre[i],i);
    }
    printf("%d\n",ans);
}

The matrix233的简单概率论考试

The matrix233经过一轮紧张的复习终于迎来了刺激的概率论考试。众所周知,概率论考试每个人的题都是按概率随机分配,并且非常简单,因此考试刚开始便有人交卷离开。

而matrix此时也看到了自己的题目:
在这里插入图片描述
在这里插入图片描述
输入样例:

2
4
1 2 3 4
2 2 
1 3

输出样例:

2 0.00
15 1.00
参考代码
/*

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值