题意:略。
先用dfs找出9位数中平方末尾是987654321的个数。具体来说,设乘数a8a7a6a5a4a3a2a1a0,平方。那么,a0只能是1或是9。如果是9将进位8(记为c)递归给十位。十位是(a1*a0+a0*a1+c)%10,检查如果是2,再递归(a1*a0+a0*a1+c)%10给下一位。然后(a2*a0+a1*a1+a0*a2+c)这样。其实是将数拆成10进制再乘。比如321*321=(3*10^2+2*10^1+1)*(3*10^2+2*10^1+1)。观察一下。我也是看fft的乘法时学会的。
结果有8个。那么十位时末尾必须为这8个,因为后9位数只由后9位数字产生。第10位能有9个(除了0)。为72。以后多一位*10.
dfs:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=10,INF=0x7FFFFFFF; int arr[SZ]; void dfs(int pos,int c) { if(pos==9) { for(int i=SZ;i>=0;--i) { cout<<arr[i]; }cout<<endl; return; } for(int i=0;i<SZ;++i) { arr[pos]=i; int cur=c; for(int j=0;j<=pos;++j)cur+=arr[j]*arr[pos-j]; if(cur%10==pos+1) { dfs(pos+1,cur/10); } } } int main() { //cout<<ceil(-10.3)<<endl; std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); for(int i=0;i<SZ;++i) { arr[0]=i; if(i==1||i==9)dfs(1,(i*i)/10); } return 0; }
代码:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=120,INF=0x7FFFFFFF; int main() { //cout<<ceil(-10.3)<<endl; std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n; cin>>n; if(n<9)cout<<0<<endl; else if(n==9)cout<<8<<endl; else { cout<<72; for(int i=0;i<n-10;++i)cout<<0; cout<<endl; } return 0; }