NOJ 212题K尾相等数
【摘要】 题目链接~~>
这题属于简单题,本来不想写进博客,但看了别人的优代码,真没想到那种方法,比较好。我用的快速幂然后开始遍历,时间可想而知。。。
代码(本人):
#include<stdio.h>int pow(int b,int m)//快速幂{ int ans=1; while(...
这题属于简单题,本来不想写进博客,但看了别人的优代码,真没想到那种方法,比较好。我用的快速幂然后开始遍历,时间可想而知。。。
代码(本人):
-
#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]);
-
}
-
}
文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nyist_zxp/article/details/9449365
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)