T组数据,给出N,求出N!最右边非零的数。

对于30%的数据,N <= 30,T<=10。

对于全部的数据,N <= 10^2009,T<=30。

一道数学题

解析

N!/(10x)最后一位数字即是结果。10x进行拆分,变成5^x* 2x。怎么除以5x呢,好办,乘的时候含有5的倍数的一项全部不乘进去,再递归此过程。即

1 2 3 4 (15) 6 7 8 9 (25)

11 12 13 14 (35)16 17 18 19 (45)

21 22 23 24 (55) 26 27 28 29 (65) ...

再递归处理

1 2 3 4 (1*5) 6

而且可以发现,不算5倍数一项进去,每十个一组,最末尾结果是一样的:6,且6*6还是6!

接下来的问题,怎么除2^x呢?

分析发现:

2^0 = 1

2^1 = 2

2^2 = 4

2^3 = 8

2^4 =16=(6)

且2,4,6,8乘以6最末尾还是原来的数。所以,可以分析看x%4是多少,若为1,说明原来的结果相当于多乘了一个2(其他的那些2刚好是4的倍数,不影响结果),所以,我们本来是要除以2的,但是很显然对结果再补乘3个2(2^3)即可消除影响,得到正确答案。其他情况同理。至此,思路理顺。

代码

#include<bits/stdc++.h>
using namespace std;
int T,n,ans,mod,rest,x;
bool flag;
const int v[10]={1,1,2,6,4,4,4,8,4,6};
char s[3000];
int a[3000];
const int k[4]={6,8,4,2};
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",s);
memset(a,0,sizeof(a));
n=strlen(s);
for(int i=1;i<=n;++i){
a[i]=s[n-i]-'0';
}
ans=1;
mod=0;
flag=0;
while(1){
rest=0;
ans=(ans*v[a[1]])%10;
if(n>1) ans=(ans*6)%10;
for(int i=n;i>=1;i--){
x=rest*10+a[i];
rest=x%5;a[i]=x/5;
}
while((n>0)&&(a[n]==0)) n--;
if(n==0) break;
flag=true;
mod=(mod+a[2]*10+a[1])%4;
}
if(flag) ans=(ans*k[mod])%10;
printf("%d\n",ans);
}
return 0;
}

yzoj P1122 阶乘 题解的更多相关文章

  1. yzoj P1126 塔 题解

    题意:给n个积木,搭成两个高度相同的塔,问最高高度 正解是dp 答案在dp[n][0] 代码 #include<bits/stdc++.h> using namespace std; in ...

  2. 洛谷P1661 & yzoj 1650 扩散 题解

    题意 先讲一下一种容易陷入误区错误思路 要使时间最小,就去找相对于每个点的最短曼哈顿距离,然后取最大值,时间就是(maxn+1)/2. 代码 #include<cstring> #incl ...

  3. [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

    题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...

  4. yzoj P2345 战争 题解

    纯数论 30分:纯暴力,直接模拟判断t秒后,判断hp是否小于0 60分: atk>=h,就是一炮一个,那么军队会在min(n,t)秒之后停止攻击,那么总伤害就是a[n+(n-1) +(n-2)+ ...

  5. yzoj P2371 爬山 题解

    背景 其实 Kano 曾经到过由乃⼭,当然这名字⼀看⼭主就是 Yuno 嘛.当年 Kano 看见了由乃⼭,内⼼突然涌出了⼀股杜甫会当凌绝顶,⼀览众⼭⼩的 豪⽓,于是毅然决定登⼭.但是 Kano 总是习 ...

  6. 2019 Multi-University Training Contest 2: 1010 Just Skip The Problem 自闭记

    2019 Multi-University Training Contest 2: 1010 Just Skip The Problem 自闭记 题意 多测.每次给你一个数\(n\),你可以同时问无数 ...

  7. 洛谷 P2388 阶乘之乘 题解

    本蒟蒻又来发题解了QwQ; 看到这个题目,本蒟蒻第一眼就想写打个暴力: 嗯,坏习惯: 但是,动动脑子想一想就知道,普通的的暴力是过不了的: 但是,身为蒟蒻的我,也想不出什么高级的数学方法来优化: 好, ...

  8. 洛谷题解 P1134 【阶乘问题】

    原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...

  9. 【题解】p2388阶乘之乘

    原题传送门 题解一堆\(O(n)\)算法真给我看傻了. 考虑\(10=2*5\),因子2肯定更多,所以计算因子5的个数即可. 从5到n这\(n-5+1\)个数的阶乘里面,都各自含有一个因子\(5=1* ...

随机推荐

  1. zabbix监控WEB网站性能

    一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...

  2. 什么是redis的缓存雪崩与缓存穿透

    今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓 ...

  3. Maven从入门到放弃

    1.maven是什么? maven是Apache下的一个纯java开发的一个开源项目,它是一款能够抽象构建过程,并且提供依赖管理,中央仓库,自动下载构建等功能的项目构建工具. 2.为什么要使用mave ...

  4. 数据结构之堆栈C++版

    /* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...

  5. 通过wireshark学习Traceroute命令和mtr(UDP,ICMP协议)

    traceroute: 通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径.用来调试网络连接性和路由问题. mtr: traceroute的一个变种,能根 ...

  6. 2月9日 《Java 8实战》读后感

    第一部分 基础知识 第3章 Lambda表达式 使用函数式接口 Predicate Consumer Function 第二部分 函数式数据处理 第4章 引入流 第5章 使用流 第6章 用流收集数据 ...

  7. Python递归函数,二分查找算法

    目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...

  8. C#将图片转换成字符画

    先看一下效果图 在Main方法中调用(首先要添加程序集System.Drawing,然后引入命名空间System.Drawing) ConvertToChar(new Bitmap(@"D: ...

  9. 解决微信二次分享失败--后面被加上from=singlemessage&isappinstalled=0的解决方案

    首次分享成功,点开后再次分享或第三次分享就失败了 1.检查你分享的链接,看是否多了两个参数,微信分享会根据分享的不同,为原始链接拼接: 朋友圈   from=timeline&isappins ...

  10. (二十四)c#Winform自定义控件-单标题窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...