Luogu P1134 阶乘问题 【数学/乱搞】 By cellur925

输入输出格式

输入格式:

仅一行包含一个正整数 NN 。

输出格式:

一个整数,表示最右边的非零位的值。

输入输出样例

输入样例#1: 
12
输出样例#1: 
6

说明

USACO Training Section 3.2

毒瘤markdown复制不下来啊qwq。

这是一道数学题,也可以称为乱搞题。像我这样的蒟蒻见到数论一定先打表。这次打表很顺利。

用程序跑到了23!,再结合win7的计算器,苟且搞到了25!以内的数据。继续冷静分析。发现除了1!,其他的结果(尾数最靠右且不为0)只可能为2,4,6,8.再略微观察以下,由于求非零的最后一位,所以我们每次都不需保留完整信息,记着两乘数的尾数然后再记录积的尾数即可。结果在5!,15!,25!时,这个法则不适用,乘后积为0,如果放任他们这样,就会gg了。

那就尝试特判,找出的规律要求我再记下倒数第二位数字是什么。然鹅...沿着这样的思路延续了十几分钟(大概),我再也推不下去了qwq。并没有规律啊...

于是我打开了tijie,看到大家很少有严格推导证明,都是暴力模拟(?),然而他们打暴力打的还非常有道理。

好吧,我可能不得不相信,数论题就是在得知少部分结论的基础上乱搞

ans至少保留8位数字,因为最大的数为8位,所以每次ans%=10改成%=100000000就行了(这句是从题解抄来的)

然后在注意开ll,最后输出再取个膜就星了。

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 
 5 using namespace std;
 6 typedef long long ll;
 7 
 8 ll n,pre;
 9 
10 int main()
11 {
12     scanf("%lld",&n);
13     pre=1;
14     for(int i=2;i<=n;i++)
15     {
16         pre=pre*i;
17         while(pre%10==0) pre/=10;
18         pre%=10000000;
19     }
20     printf("%lld",pre%10);
21     return 0;
22 }
View Code

猜你喜欢

转载自www.cnblogs.com/nopartyfoucaodong/p/9398567.html