直接高精度模拟即可。

以下代码来自

#include<bits/stdc++.h>
using namespace std;
char s[610];
int point=-1;
int Cnt=0;
namespace mysqrt
{
	char jg[610]={'0'};
	int cnt=0;
	int l=0;
	int work(int o,char *O,int I)
	{
	    char c,*D=O;
	    if(o>0)
	        for(l=0;D[l];D[l++]-=10)
	        {
	            D[l++]-=120;
	            D[l]-=110;
	            while(!work(0,O,l))
	                D[l]+=20;
	            jg[++cnt]=(D[l]+1032)/20;
	        }
	    else
	    {
	        c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
	        D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
	    }
	    return o;
	}
	char* bigsqrt(char *S,int k)
	{
		char *ss=S;
		memset(jg,'\0',sizeof(jg));
		jg[0]='0';
		cnt=0;
		int CNT=Cnt;
		for(;Cnt<CNT+2*k;) ss[++Cnt]='0';
		if(strlen(ss)&1)
	        work(2,ss+1,0);
	    else
	        work(2,ss,0);
	    point=cnt-k;
	    for(int i=1;i<=point;i++) jg[i]='0';
	    return jg;
	}
}
using namespace mysqrt;
int n,k;
char x;
char *s1;
int ans1,ans2;
int main()
{
	cin>>n>>k>>x;
	for(int i=2;i<=k;i++)
	{
	    int tmp=sqrt(i);
	   // if(tmp*tmp==i) continue;
		memset(s,'\0',sizeof(s));
		s[0]='0';
		cnt=Cnt=0;
		point=-1;
    	snprintf(s,sizeof(s),"%d",i);
    	s[strlen(s)]='0';
    	Cnt=strlen(s)-1;
    	for(int i=strlen(s)-1;i>0;i--) swap(s[i],s[i-1]);
    	s1=bigsqrt(s,n+1);
    	int tmm=strlen(s1)-1;
    	while(s1[tmm]>=53)
		{
			s1[tmm-1]++,s1[tmm]=48,--tmm;
			if(s1[tmm]!=':') break;
		}
		
    	s1[strlen(s1)-1]='\0';
    	for(int j=point+1;j<strlen(s1);j++)
    	{
    		if(s1[j]==x) ans1++;
    		ans2+=s1[j]-48;
    	}
	}
	cout<<ans1<<endl<<ans2;
    return 0;
}