标签:
给你一个奇质数
首先我们将其分成两个集合
所以
当然此题需要高精度,我要骂人了,看我的变量名就知道了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int Mod=1000000;
int N;
int P;
struct gjd_
{
int cnmbdctr[600];
};
inline struct gjd_ operator * (struct gjd_ a1,int a2)
{
struct gjd_ bb=a1;
for(register int i=1;i<=bb.cnmbdctr[0];i++)
{
bb.cnmbdctr[i]*=a2;
if(bb.cnmbdctr[i-1]>=Mod && i!=1)
{
bb.cnmbdctr[i]+=bb.cnmbdctr[i-1]/Mod;
bb.cnmbdctr[i-1]%=Mod;
}
}
for(register int i=bb.cnmbdctr[0];bb.cnmbdctr[i]>=Mod;bb.cnmbdctr[0]++,i++)
bb.cnmbdctr[i+1]+=bb.cnmbdctr[i]/Mod,bb.cnmbdctr[i]%=Mod;
return bb;
}
inline struct gjd_ operator / (struct gjd_ a1,int a2)
{
struct gjd_ bb=a1;
int re=0;
for(register int i=bb.cnmbdctr[0];i>=1;i--)
{
int gg=re*Mod+bb.cnmbdctr[i];
bb.cnmbdctr[i]=gg/a2;
re=gg%a2;
}
for(register int i=bb.cnmbdctr[0];i>=1 && bb.cnmbdctr[i]==0;i--,bb.cnmbdctr[0]--);
return bb;
}
inline struct gjd_ operator + (struct gjd_ a1,int a2)
{
struct gjd_ bb=a1;
bb.cnmbdctr[1]+=a2;
for(register int i=1;i<=bb.cnmbdctr[0];i++)
{
if(bb.cnmbdctr[i]>=Mod)
bb.cnmbdctr[i+1]+=bb.cnmbdctr[i]/Mod,bb.cnmbdctr[i]%=Mod;
else break;
if(i==bb.cnmbdctr[0]) bb.cnmbdctr[0]++;
}
return bb;
}
inline struct gjd_ operator - (struct gjd_ a1,int a2)
{
struct gjd_ bb=a1;
bb.cnmbdctr[1]-=a2;
for(register int i=1;i<=bb.cnmbdctr[0];i++)
{
if(bb.cnmbdctr[i]<0)
bb.cnmbdctr[i+1]--,bb.cnmbdctr[i]+=Mod;
else break;
}
for(register int i=bb.cnmbdctr[0];i>=1 && bb.cnmbdctr[i]==0;i--,bb.cnmbdctr[0]--);
return bb;
}
inline void prt(struct gjd_ a1)
{
printf("%d",a1.cnmbdctr[a1.cnmbdctr[0]]);
for(register int i=a1.cnmbdctr[0]-1;i>=1;i--)
printf("%06d",a1.cnmbdctr[i]);
puts("");
return;
}
int main()
{
scanf("%d",&N);
for(;N>0;N--)
{
scanf("%d",&P);
struct gjd_ ans={{1,1}};
for(int i=P+1;i<=2*P;i++)
if(i&1) ans=ans*i;
else ans=ans*2;
for(int i=2;i*2<=P;i++)
ans=ans/i;
ans=ans-2;
ans=ans/P;
ans=ans+2;
prt(ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/qq_21995319/article/details/45821211