C 数学有关问题

C 数学问题
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?

为什么第M个数 这样表示:
(m-1)*1000+471  

------解决方案--------------------
程序证明:

#include<iostream>
using namespace std;

int main()
{
for(int i=0;i<1000;i++)
if((i*i*i)%1000 == 111)
cout<<i<<endl;
return 0;
}

结果只有一个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为自然数)