标签:reg col efi strong pre ring define clu str
usqwedf 改编系列题。
给定一个n*m的矩阵,问从左上角走到右下角有多少条路径。
输入格式:
一行两个正整数 n,m
输出格式:
路径数目 t
1<=n<=100000000 1<=m<=4
从(1,1)点到(n,m)的走法共有才C(n,n+m)种
输出有点变态,最后结果要保留17位有效数字!!!
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 100000 using namespace std; int n,m,x,y,l1,l2,sum,c[N],a[N],b[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int work1(int x) { for(int i=1;i<=l1;i++) b[i]*=x; for(int i=1;i<=l1;i++) b[i+1]+=b[i]/10,b[i]%=10; while(b[l1+1]) ++l1; while(b[l1]>9) b[l1+1]=b[l1]/10,b[l1]%=10,++l1; while(!b[l1]) l1--; } int work2() { for(int i=0;i<l1;i++) a[i]=b[l1-i]; for(int i=0;i<l1;i++) { if(x<y) { if(sum) c[++sum]=0; x=x*10+a[i]; } else { c[++sum]=x/y; x%=y; x=x*10+a[i]; } } c[++sum]=x/y; for(int i=1;i<=min(sum,17);i++) printf("%d",c[i]); for(int i=1;i<=max(0,sum-17);i++) printf("0"); } int main() { n=read(),m=read();b[1]=l1=y=1; for(int i=1;i<=m;i++) y*=i; for(int i=n+1;i<=n+m;i++) work1(i); work2(); return 0; }
标签:reg col efi strong pre ring define clu str
原文地址:http://www.cnblogs.com/z360/p/7898488.html