问题描述
给定n和len,输出n!末尾len位。
输入格式
一行两个正整数n和len。
输出格式
一行一个字符串,表示答案。长度不足用前置零补全。
样例输入
6 5
样例输出
00720
数据规模和约定
n<=30, len<=10。
基础还是不扎实,调试了好久,一些细节问题没有考虑好,配合测试样例才一步一步改好。
解题思路:之前做过一个类似的简化版的题目,忘记在哪做的了,以后补上。
本题既然要输出n!的后len位,那就在求n!的过程中每一步都对10^(len+2)取模。最后将阶乘结果转为字符串,方便加上前导0.
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll f(int n) { //返回10的n次方 5 ll t = 1; 6 for (int i = 1; i <= n; i++) { 7 t *= 10; 8 } 9 return t; 10 } 11 int main() { 12 int n, len; 13 cin >> n >> len; 14 ll ans = 1; 15 ll mod = f(len + 2); 16 for (int i = 1; i <= n; i++) { 17 ans = (ans % mod * i % mod) % mod; 18 } 19 string s = ""; 20 while (ans) { 21 int t = ans % 10; 22 s += t + '0'; 23 ans /= 10; 24 } 25 s = s.substr(0, len); 26 reverse(s.begin(), s.end()); 27 while (s.length() < len) { 28 s = "0" + s; 29 } 30 cout << s << endl; 31 return 0; 32 }