题目:Just the Facts
思路:枚举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",n,ans);}return 0; }