思路:枚举10000素数内,各因子出现的次数,然后取模为10。因为0是由2和5构成的,所以2和5的幂单独讨论,同时由于2的幂肯定大于5的,所以我们最后要算的再乘上2的减去后的幂就可以得到。

#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <iostream> using namespace std; const int maxn=10001; int n_prime=0; int prime[maxn]; int vis[maxn]; void Prime() { memset(vis,1,sizeof(vis)); vis[0]=vis[1]=0; for(int i=2;i<maxn;i++) if(vis[i]) { prime[++n_prime]=i; for(int j=2*i;j<maxn;j+=i) vis[j]=0; } } int get(int n,int p) { int ans=0; int tmp=p; while(n>=tmp) { ans+=n/tmp; tmp*=p; } return ans; } long long Pow(long long a,long long b) { long long ans=1; while(b) { if(b&1) { b--; ans=(ans*a)%10; } else { b/=2; a=(a*a)%10; } } return ans; } int main() { Prime(); int n; while(scanf("%d",&n)!=EOF) { long long ans=1; for(int i=1;i<=n_prime;i++) { if(prime[i]==5||prime[i]==2) continue; ans=(ans*Pow(prime[i],get(n,prime[i])))%10; } ans=(ans*Pow(2,get(n,2)-get(n,5)))%10; printf("%5d -> %lld ",n,ans); } return 0; }