小光棍数
时间限制:1000 ms | 内存限制:65535 KB
难度:1
-
描述
-
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
-
输入
- 有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。 输出
- 输出第m个小光棍数。 样例输入
-
1 1
样例输出 -
471
第一次看到这个题 :我想的方法如下:
*#include<stdio.h> int main() { int n,m,count,i,a; scanf("%d",&n); while(n--) { count=0; scanf("%d",&m); for(i=1;count<m;i++) { a=i*i*i; if((a-111)%1000==0) count++; } printf("%d\n",i-1); } return 0; }
没有通过,因为时间限制。于是又在我网上搜答案。
#include<stdio.h> int main() { int m; _int64 n; scanf("%d",&m); while(m--) { scanf("%lld",&n); printf("%lld\n",(n-1)*1000+471); } return 0; }
为什么第M个数 这样表示:
(m-1)*1000+471
(x+y)^3 =x(x^2+ 3xy + 3y^2)+y^3
令x=(m-1)*1000, y = 471, 则对最后三位数产影响的部分x(x^2+ 3xy + 3y^2)+y^3,已经知道y^3的后三位数是111
而x(x^2+ 3xy + 3y^2)+y^3)为1000*z(z为自然数)
这是数学证明。
但还是没有AC过去。估计南阳理工编译器不是VC++、
最终通过的:
就是把_int 64 改为 long long 就可以了。