现在的位置: 首页 > 综合 > 正文

vijos P1200 ganggang的烦恼

2018年04月24日 ⁄ 综合 ⁄ 共 1133字 ⁄ 字号 评论关闭

背景

Zhang Gangrui 年纪大了,记性不好,保险箱的密码记不住了,他只记得密码是一个数的阶乘各个位的数相加的和,最后还有个T或F,
代表这个数是否为素数,正好,你到他家去了,他请你帮他这个忙,并答应事成之后给你100000000 MOD 10 RMB。

描述

输入一个整数n(1000>=n>=0)
输出n的阶乘各个位的数相加的和y,最后再输出T或F,
代表y是否为素数。

格式

输入格式

输入一个整数n(1000>=n>=0)

输出格式

输出n的阶乘各个位的数相加的和y,最后再输出对y是否为素数的判断,
是为T否为F。

样例1

样例输入1[复制]

10

样例输出1[复制]

27F

题解

高精度乘法和素数判断。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define mod 10007
#define N 10000
#define ll long long
using namespace std;
int n;
struct shu{int s[500],l;} a,b,c;
int ans;
shu operator * (const shu &x,const shu &y)
{
	shu ans;
	memset(ans.s,0,sizeof(ans.s));
	int i,j;
	for(i=1;i<=x.l;i++)
	for(j=1;j<=y.l;j++)
	   ans.s[i+j-1]+=x.s[i]*y.s[j];
	ans.l=x.l+y.l-1;
	for(i=1;i<=ans.l;i++)
	   {if(ans.s[i]>=N)
	       {ans.s[i+1]+=ans.s[i]/N;
		    ans.s[i]%=N;
		   }
	   }
	i=ans.l+1;
	while(ans.s[i]>0)
	   {if(ans.s[i]>=N)
	       {ans.s[i+1]+=ans.s[i]/N;
		    ans.s[i]%=N;
		   }
		i++;
	   }
	ans.l=i-1;
	return ans;
}
void calcu()
{
	int i,j;
	c.s[1]=1; c.l=1;
	for(i=2;i<=n;i++)
	   {a=c;
	    b.s[1]=i; b.l=1;
	    c=b*a;
	   }
	for(i=1;i<=c.l;i++)
	for(j=1;j<=4;j++)
	   {ans+=c.s[i]%10;
	    c.s[i]/=10;
	   }
	printf("%d",ans);
}
void check()
{
	int i;
	for(i=2;i<=sqrt(ans);i++)
	   {if(ans%i==0) {puts("F"); return;}}
	puts("T");
}
int main()
{
	scanf("%d",&n);
	calcu(); check();
	return 0;
}

抱歉!评论已关闭.