http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=783
http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=66
先说简单一点的:要求该数的最右边的一个数字我们可以发现它只和n的个位数有关,而且有一点的循环性,循环节肯定小于10,因此我们可以利用找循环节的方法来想。
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; LL n; int num[100]; bool flag[100]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); int a=n%10; if(a==0) { printf("0\n"); continue; } int b=a; memset(num,0,sizeof(num)); memset(flag,false,sizeof(flag)); int i=0; while(!flag[a]) { num[i++]=a; flag[a]=true; a=(b*a)%10; } int sum=i; /*for(int i=0;i<sum;i++) printf("%d ",num[i]); printf("\n");*/ printf("%d\n",num[(n-1)%sum]); } return 0; }
#include <stdio.h> #include <string.h> #include <math.h> using namespace std; typedef long long LL; double a; LL n; int main() { int T; scanf("%d",&T); while(T--) { scanf("%lld",&n); a=n*log10(n); a-=(LL)a; printf("%lld\n",(LL)pow(10,a)); } return 0; }