看到数据范围就知道需要用高精度乘法。。不过是一个整型*一个高精类型的,我们可以重载运算符来计算,数据比较水。
记录数字每一位数的数组开到5000左右就够了,我之前开到1000跑不出500以后的数,结果居然A了。。。这个数据真的水
管他啥的数学规律,素数判断无脑欧拉筛。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxm=200010;
const int maxn=1010;
int n;
bool note[maxm];
int prize[maxm];
int tot;
struct gj
{
int tot;
int num[5010];
};
gj operator *(const gj A,const int x)
{
gj C;
memset(C.num,0,sizeof(C.num));
C.tot=A.tot;
for(int i=1;i<=C.tot;i++)
{
C.num[i]+=A.num[i]*x;
}
for(int i=1;i<=C.tot;i++)
{
if(C.num[i]>9)
{
C.num[i+1]+=C.num[i]/10;
C.num[i]%=10;
C.tot=max(C.tot,i+1);
}
}
return C;
}
void xxs()
{
note[1]=true;
for(int i=2;i<=maxm;i++)
{
if(!note[i])
{
prize[++tot]=i;
}
for(int j=1;j<=tot;j++)
{
if(i*prize[j]>maxm) break;
note[i*prize[j]]=true;
if(i%prize[j]==0) break;
}
}
}
int main()
{
scanf("%d",&n);
gj ans;
ans.tot=1;
ans.num[1]=1;
for(int i=1;i<=n;i++)
{
ans=ans*i;
}
int sum=0;
for(int i=1;i<=ans.tot;i++)
{
sum+=ans.num[i];
}
printf("%d",sum);
xxs();
if(note[sum]==true) cout<<"F";
else cout<<"T";
return 0;
}