比比谁更大(大数模运算溢出)

#include<bits/stdc++.h>
#define ll long long
using namespace std;

void re(ll a, ll b){
	if(a>b)
	printf("a is the winner!");
	if(a<b)
	printf("b is the winner!");
	if(a==b)
	printf("There is no winner!");
	return;
}

ll ji(int a){
	ll ct1=1;
	ll ct2=a;
	for(int ct3=0; ct3<ct2; ct3++)
	{
		ct1=ct1*a%999068070;//利用乘法分配律的特性将整数抛去,只留下余数,比如:22=2*7+1,那么下次22*23%7的余数实际上就是1*23%7的值,避免了溢出问题
		a--;
		if(ct1==0)//当余数为0时,后边的阶乘将没有意义,所以直接跳出,减少运行时间
		break;
	}
	return ct1;
}
int main(){
	ll a,b;
	cin>>a>>b;
	ll c,d;
	c=ji(a);
	d=ji(b);
	re(c,d);
	return 0;
	
}
链接:https://ac.nowcoder.com/acm/contest/24803/A
来源:牛客网

题目描述

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

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

假设两块石头的重量分别为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(1a,b109).

输出描述:

如果重量为a的石头胜出,则输出"a is the winner!"
如果重量为b的石头胜出,则输出"b is the winner!"
如果两者打平,则输出"There is no winner!"
注意:不需要输出""



long long最大阶乘20!
int最大阶乘12!
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务