某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。
标签:-- 真心 map -o string math 递推 高精度加法 ide
输入文件中仅有一行,包含两个整数n和m,表示城市街区的规模。
输出文件中仅有一个整数和一个换行/回车符,表示不同的方案总数。
1 #pragma GCC optimize("-O2") 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <queue> 7 #include <algorithm> 8 #include <cmath> 9 #include <map> 10 #include <set> 11 #define N 5005 12 using namespace std; 13 int n,m,p=10000; 14 struct no 15 { 16 int a[20005],l; 17 }an,as; 18 void print(no a) 19 { 20 for(int i=a.l;i>0;i--) 21 cout<<a.a[i]; 22 cout<<endl; 23 } 24 int cheng(no a,no b) 25 { 26 memset(an.a,0,sizeof(an.a)); 27 an.l=0; 28 for(int i=1;i<=b.l;i++) 29 { 30 int la=0; 31 for(int j=1,to=i;j<=a.l+2;j++,to++) 32 { 33 int x=a.a[j]*b.a[i]+la; 34 an.a[to]+=x%p; 35 if(an.a[to]>p) 36 { 37 an.a[to+1]+=an.a[to]/p; 38 an.a[to]%=p; 39 } 40 la=x/p; 41 } 42 } 43 for(int i=a.l+b.l;i>=0;i--) 44 { 45 if(an.a[i]) 46 { 47 an.l=i; 48 break; 49 } 50 } 51 } 52 void chu(no a,int x) 53 { 54 memset(an.a,0,sizeof(an.a)); 55 an.l=0; 56 long long sum=0; 57 for(int i=a.l;i>=1;i--) 58 { 59 sum*=p; 60 sum+=a.a[i]; 61 if(sum<x) 62 { 63 an.a[i]=0; 64 continue; 65 } 66 if(!an.l)an.l=i; 67 an.a[i]=sum/x; 68 sum%=x; 69 } 70 } 71 no c; 72 no get(int x) 73 { 74 c.l=0; 75 memset(c.a,0,sizeof(c.a)); 76 while(x) 77 c.a[++c.l]=x%p,x/=p; 78 if(!c.l)c.l=1; 79 return c; 80 } 81 void jian(no a,no b) 82 { 83 an.l=0; 84 memset(an.a,0,sizeof(an.a)); 85 for(int i=1;i<=max(a.l,b.l);i++) 86 { 87 if(a.a[i]<b.a[i]) 88 { 89 a.a[i]+=p; 90 a.a[i+1]--; 91 } 92 an.a[i]=a.a[i]-b.a[i]; 93 } 94 for(int i=max(a.l,b.l)+2;i>0;i--) 95 { 96 if(an.a[i]) 97 { 98 an.l=i; 99 break; 100 } 101 } 102 } 103 no get_c(int x,int y) 104 { 105 no ans; 106 ans.l=1;ans.a[1]=1; 107 for(int i=y+1;i<=x;i++) 108 { 109 cheng(ans,get(i)); 110 ans=an; 111 } 112 for(int i=2;i<=x-y;i+=2) 113 { 114 if(i+1<=x-y) 115 chu(ans,i*(i+1)); 116 else 117 chu(ans,i); 118 ans=an; 119 } 120 return ans; 121 } 122 void work() 123 { 124 no a=get_c(n+m,n),b; 125 b=a; 126 cheng(b,get(m)); 127 b=an; 128 chu(b,n+1); 129 b=an; 130 jian(a,b); 131 printf("%d",an.a[an.l]); 132 for(int i=an.l-1;i>0;i--) 133 { 134 printf("%04d",an.a[i]); 135 } 136 } 137 int main() 138 { 139 scanf("%d%d",&n,&m); 140 work(); 141 return 0; 142 }
10.1 国庆节给祖国母亲献礼 NOIP 模拟题 第一题网格题解
标签:-- 真心 map -o string math 递推 高精度加法 ide
原文地址:http://www.cnblogs.com/liutianrui/p/7617482.html