码迷,mamicode.com
首页 > 其他好文 > 详细

10.1 国庆节给祖国母亲献礼 NOIP 模拟题 第一题网格题解

时间:2017-10-01 18:07:55      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:--   真心   map   -o   string   math   递推   高精度加法   ide   

3907: 网格

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 490  Solved: 226
[Submit][Status][Discuss]

Description

某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。
技术分享

Input

输入文件中仅有一行,包含两个整数n和m,表示城市街区的规模。

 

Output

输出文件中仅有一个整数和一个换行/回车符,表示不同的方案总数。

 

Sample Input

6 6

Sample Output

132

HINT 

100%的数据中,1 <= m <= n <= 5 000
  首先感谢一下大佬团,他们做过一开始的题,然而我一个也不会做……于是乎换了一套画风正常了许多的题……
  当时乍一看图时以为只是输出卡特兰数裸题,然而读完题发现真心坑爹,高精度都出来了,还得现推,唯一靠谱的就是有给卡特兰数的水分。然后开始先打卡特兰数的暴力。不得不说,由于有了高精度,这是我见过最最恶心的暴力了。
  然而,我当时忘了卡特兰数O(n)的递推式了,只能凭借残存的记忆强行现推,还神乎其技的推对了……
  打完卡特兰数的暴力后就开始去打n<=100的暴力,也就是宽搜,一开始没反应过来,只打了int 的,然后发现不行,也得打高精度,没办法,又强行打了高精度加法,有意思的就在这了,我貌似无法在内存允许的情况下去打高精度,只能委屈求全,高精度只开了200,才不能M。结果出题人十分“良心”,不但n<=100一分没得,还因为数组开太小挂了一个卡特兰数……
  现在我们说正解。
  正解就是一个结论:C(n+m,n)-C(n+m,m-1)。作为蒟蒻的我是不会证了。小姨子表示左侧是从(0,0)到(n,m)的总步数,C(n+m,m-1)是不合法的方案数。只能这么理解了。
  然后,剩下就是赤裸裸的高精度了。由于没有压位,果断T掉,然后现场向原子核学了一发压位高精度,发现还是挺好打得……
技术分享
  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 }
View Code

10.1 国庆节给祖国母亲献礼 NOIP 模拟题 第一题网格题解

标签:--   真心   map   -o   string   math   递推   高精度加法   ide   

原文地址:http://www.cnblogs.com/liutianrui/p/7617482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!