Denis are dreptate pana la un punct si anume ca te intereseaza doar ultimele 9 cifre si inceputul de idee.
Cel mai usor e sa folosesti metoda backtracking prin care sa depistezi cifra cu cifra numerele de 1, 2 , 3, ..., 9 cifre care ridicate la patrat se termina in 1, 21, 321, ..., 987654321. Iti dau mai jos o posibila implementare a unui astfel de back.
void bk(int poz)
{
int i,j,c;
if(poz==9)
{
for(i=8;i>=0;i--)
g<<sol[i];
g<<'\n';
return;
}
for(c=0;c<=9;c++)
{
sol[poz]=c;
for(i=0;i<=poz;i++)ver[i]=0;
for(i=0;i<=poz;i++)for(j=0;j<=poz;j++)ver[i+j]+=sol[i]*sol[j];
for(i=0;i<=poz;i++){ver[i+1]+=ver[i]/10;ver[i]%=10;}
for(i=0;i<=poz;i++)if(ver[i]-i-1)break;
if(i==poz+1)bk(poz+1);
}
}
Am rulat si se pare ca raspunsul la intrebarea ta e foarte simplu. In primul rand trebuie sa ai n > = 9. In al doilea rand ultimele 9 cifre nu pot fi decat in una dintre urmatoarele 8 variante:
111111111
611111111
380642361
880642361
119357639
619357639
388888889
888888889
Daca nu gresesc atunci raspunsul este :
0 daca
n<98 daca
n=9 8*10n-9 daca
n>9 ( 8 moduri de a forma sufixul de 9 cifre a numarului cautat si 10
n-9 moduri de a pune cele cel mult n-9 cifre din prefixul numarului.