洛谷P2532:https://www.luogu.org/problemnew/show/P2532
思路
来自Sooke大佬的推导:
https://www.luogu.org/blog/Sooke/solution-p2532
代码
#include<iostream> #include<cstdio> using namespace std; #define maxn 550 int n; int a[maxn],b[maxn],ans[maxn*20]; int gcd(int a,int b) { if(!b) return a; else return gcd(b,a%b); } void mul(int x) { int k=0; for(int i=1;i<=ans[0];i++) { ans[i]*=x; ans[i]+=k; k=ans[i]/10; ans[i]%=10; } while(k) { ans[++ans[0]]=k%10; k/=10; } } int main() { scanf("%d",&n); for(int i=2;i<=n;i++)//经过化简的分子分母 { a[i-1]=i+n;//分子 b[i-1]=i;//分母 } for(int i=1;i<n;i++) { for(int j=1;j<n;j++) { if(b[j]==1) continue;//如果分母是1 则不用约 int d=gcd(a[i],b[j]); if(d!=1)//如果gcd不为1 则分子分母同时除gcd约分 { a[i]/=d; b[j]/=d; } if(a[i]==1) break;//如果分子已经约完就可以退出 } } //此时分母已经为1了 只需要把分子用高精乘起来即是ans ans[0]=ans[1]=1;//ans[0]为位数 for(int i=1;i<n;i++) { if(a[i]==1) continue; mul(a[i]); } for(int i=ans[0];i>=1;i--) printf("%d",ans[i]); }