2021年广东工业大学第11届腾讯杯新生程序设计竞赛 A-比比谁更大

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

在一个夜黑风高的晚上,牛哥哥吃完心爱的烤串串之后,独自一人漫步在南亭的路上。由于吃的太饱了,牛哥哥决定想一道新生赛的题考(折)验(磨)一下新生,通过脑部的思想风暴促进肚子的消化。

突然间,有两块石头碰瓷了牛哥哥的脚,他气急败坏地捡起来,想要让它们消失在远方。但牛哥哥灵机一动,想要用这两块石头出道题目,以此来显示自己思维之强大。牛哥哥很喜欢竞赛,因为可以一直与别人竞争,因此他也想让两块石头一决高下!

假设两块石头的重量分别为a、b,如果只是简单地比较两者的重量,未免也太简单了。因此,牛哥哥决定计算a!和b!的大小,但因为一个数的阶乘十分之巨大,牛哥哥决定将他们阶乘的结果模一个数再进行比较。此时牛哥哥心中浮现出一个奇妙的模数------999068070,这可是一个很巧妙的模数哦,他心里想。

至此牛哥哥已经完善了他的比较过程,即已知a,b,比较(a!)%999068070和(b!)%999068070的大小,大者则胜出,如相等则打平

作为新手的你们,需要接受牛哥哥的考验,完成比较。

输入描述:

第一行输入两个两个正整数a,b(1≤a,b≤109)a,b(1\le a,b \le10^9)a,b(1≤a,b≤109).

输出描述:

如果重量为a的石头胜出,则输出"a is the winner!"

如果重量为b的石头胜出,则输出"b is the winner!"

如果两者打平,则输出"There is no winner!"

注意:不需要输出""

示例1

输入

2 1

输出

a is the winner!

示例2

输入

1 2

输出

b is the winner!

示例3

输入

2 2

输出

There is no winner!

示例4

输入

23 22

输出

b is the winner!

备注:

N的阶乘(记作 N!)是指从1到N(包括1和N)的所有整数的乘积。

取余运算符 (%),一个表达式的值除以另一个表达式的值,返回求余结果。求余是一种数学计算方法,指一个数除以另一个数,不够除的部分就是余数,就是求余的结果。

例如5%3=2

(22!)%999068070=785674890
(23!)%999068070=87297210

思路: 首先得知道  999068070=2x3x5x7x11x13x17x19x103  不懂的,重新用心做下这题

接下来就是一顿%%%%%%%%%%%%%的操作了

 解:

当a与b中只要出现了一个大于等于103的数,就能直接判断大小

if (a >= 103 || b >= 103) {
		if (a >= 103 && b >= 103)
			printf("There is no winner!");
		if (a >= 103 && b < 103)
			printf("b is the winner!");
		if (a < 103 && b >= 103)
			printf("a is the winner!");
}

如果a和b小于103  那只需要循环算一下就好了(大佬原话)

	int res = 1;
	for (int i = 1; i <= n; i++)
		res = res * i % mod;//这里通过边阶乘边取模,可以省去个long long

后面,源代码贴上

#include <bits/stdc++.h>
using namespace std;
int a, b;
const int mod = 999068070;//习惯问题

int zs(int z) {
	int res = 1;
	for (int i = 1; i <= z; i++)
		res = res * i % mod;
	return res;
}

int main() {
	scanf("%d%d", &a, &b);
	if (a >= 103 || b >= 103) {
		if (a >= 103 && b >= 103)
			printf("There is no winner!");
		if (a >= 103 && b < 103)
			printf("b is the winner!");
		if (a < 103 && b >= 103)
			printf("a is the winner!");
	} else {
		a = zs(a);
		b = zs(b);
		if (a > b)
			printf("a is the winner!");
		else if (a < b)
			printf("b is the winner!");
		else if (a == b)
			printf("There is no winner!");
	}
}

                                                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值