题目链接:http://codeforces.com/contest/869/problem/B
题意:给你两个数a,b,求它们的阶乘相除得到的结果的最后一位的数字。
题目思路:题中给的数字很大,10的18次方,所以不能用int来做,我用了字符串string。
分情况:
1、当a为0的情况。我刚开始以为当a等于0的时候0的阶乘为0,但是后面发现我错了,0的阶乘是1。接着看b的位数。
(1)b的位数为1时,这样就直接开始用for循环进行阶乘,记住每次循环乘了以后要%10,这样可以保证数字不会很大。
(2)b的位数大于1时,肯定会有10出现,10的最后一位有0,所以最后乘出来的结果一定为0
2、当a不为0的情况。判断a和b的位数是否一样。
(1)a与b的位数一样且位数大于等于2时,判断它们是否除了最后一位其他都相同,如果都相同,则flag为1
(2)a与b的位数一样且位数等于1时,先算出a与b之间相差几个数,再用for循环做
(3)剩下的情况中肯定会有是10的倍数的数字,因此结果一定为0
3、当flag为1的时候,只需要计算最后一位就好了。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
const int maxn=1010;
const int INF=0x3f3f3f3f;
int main()
{
string n,m;
cin>>n>>m;
int sum=1;
int ans=0;
int flag=0;
int lenn=n.size(),lenm=m.size();
if(n[0]=='0')
{
if(lenm==1)
{
for(int i=1;i<=m[0]-'0';i++)
{
sum*=i;
sum%=10;
}
}
else
sum=0;
}
else
{
if(lenn==lenm&&lenn>=2)
{
for(int i=lenn-2;i>=0;i--)
{
if(n[i]!=m[i])
{
flag=0;
sum=0;
break;
}
else
{
flag=1;
}
}
}
else if(lenn==lenm&&lenn==1)
{
for(int i=m[0]-'0';i>n[0]-'0';--i)
{
sum*=i;
sum%=10;
}
}
else
sum=0;
}
int s=1;
if(flag==1)
{
ans=m[lenn-1]-n[lenn-1];
s=n[lenn-1]-'0'+1;
for(int j=0;j<ans;j++)
{
sum*=s;
sum%=10;
s++;
}
}
//cout<<m[lenn-1]<<" "<<n[lenn-1]<<endl;
//cout<<s<<endl;
//cout<<ans<<endl;
cout<<sum<<endl;
return 0;
}