Luogu P1134 阶乘问题 【数学/乱搞】 By cellur925
输入输出格式
输入格式:
仅一行包含一个正整数 NN 。
输出格式:
一个整数,表示最右边的非零位的值。
输入输出样例
说明
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 }
独立意志与自由思想是必须争的,且须以生死力争。