NOJ 212题K尾相等数

来源:互联网 发布:mysql 最小值 编辑:程序博客网 时间:2024/05/01 13:32

题目链接~~>

       这题属于简单题,本来不想写进博客,但看了别人的优代码,真没想到那种方法,比较好。我用的快速幂然后开始遍历,时间可想而知。。。

代码(本人):

#include<stdio.h>int pow(int b,int m)//快速幂{    int ans=1;    while(b)    {        if(b%2)        {           ans=(m*ans)%1000;        }        b/=2;        m=(m*m)%1000;    }    return ans;}int pss(int b,int n){    int ans=1;    while(b)    {        if(b%2)        {           ans=n*ans;        }        b/=2;        n=n*n;    }    return ans;}int main(){    int T;    long long m;    int i,j,k,x,y,q;    scanf("%d",&T);    while(T--)    {        scanf("%lld",&m);         if(m<1000)//让起点大于1000           {               q=m;               for(i=1;i<=35;i++)                 if(pss(i,q)>=1000)                  break;           }         else {                q=m%1000;                i=1;              }          for(j=i;j<1000;j++)             {                  int f=0;                  for(k=i;k<j;k++)                  {                       x=pow(j,q);                       y=pow(k,q);                       if(x==y)                        {                            f=1;                            break;                        }                   }              if(f==1)                 break;             }        printf("%d\n",j+k);    }    return 0;}

代码(优):

#include<stdio.h>int main(){    long int n,k,i;    scanf("%d",&n);while(n--){scanf("%d",&k);        long int a[1000]={0},t,flag=0;        if(k>=1000){k%=1000;    a[k]++;    flag=1;}        for(t=k,i=2;;i++){   k=t*k;            if(flag==1||k>=1000){k%=1000;a[k]+=i;if(a[k]>i)//如果成立说明已经存过数break;}}        printf("%d\n",a[k]);    } }


 


 

原创粉丝点击