POJ 1942 Paths on a Grid 解题报告(double妙用)
2013-08-05 19:03
232 查看
题目大意:每次可以向上走,向右走。问有多少种走法。
解题报告:简单来说就是求Cmn。不过注意数据范围,unsigned int,用int会超。
简单做法就是循环较小的数来求,原来写的代码如下:
A了之后搜了一下别人的解题报告。不管有没有A,都看一下别人的解题帮,个人习惯,总能学点别的东西,比如这次。我们可以直接用double来存储答案。double共64位,尾数为52位,精度为-2^53到2^53(准确表示整数的范围),不用担心转换成unsigned的精度的。代码如下:
解题报告:简单来说就是求Cmn。不过注意数据范围,unsigned int,用int会超。
简单做法就是循环较小的数来求,原来写的代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; bool vis[200];; int main() { unsigned m,n; while(cin>>m>>n && (m&&n)) { memset(vis,0,sizeof(vis)); if(n<m) swap(n,m); unsigned long long ans=1; unsigned long long sum=n; sum+=m; for(unsigned i=1;i<=m;i++) { ans*=sum; sum--; for(unsigned k=1;k<=m;k++) if(!vis[k] && ans%k==0) { ans/=k; vis[k]=true; } } printf("%lld\n",ans); } }
A了之后搜了一下别人的解题报告。不管有没有A,都看一下别人的解题帮,个人习惯,总能学点别的东西,比如这次。我们可以直接用double来存储答案。double共64位,尾数为52位,精度为-2^53到2^53(准确表示整数的范围),不用担心转换成unsigned的精度的。代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <iomanip> using namespace std; bool vis[200]; int main() { unsigned m,n; while(cin>>m>>n && (m|n)) { double sum=(n+m); double mm=m<n?m:n; if(mm==0) { puts("1"); continue; } double ans=1; do { ans*=sum/mm; sum=sum-1; mm=mm-1; } while(mm>0); cout<<fixed<<setprecision(0)<<ans<<endl; } }
相关文章推荐
- poj 1942 paths on a grid
- POJ-1942-Paths on a Grid-组合数学
- POJ 1942 Paths on a Grid
- POJ 1942 Paths on a Grid【组合数学】
- poj 1942 Paths on a Grid (求组合数)
- POJ 1942 Paths on a Grid(组合数学)
- D - Paths on a Grid POJ - 1942
- poj 1942 Paths on a Grid(组合数学--组合数)
- POJ-1942 Paths on a Grid
- poj 1942 Paths on a Grid
- POJ 1942 Paths on a Grid 组合数的应用 (计算路径总个数)
- POJ 1942 Paths on a Grid(组合数公式)
- poj 1942 Paths on a Grid
- POJ1942——Paths on a Grid
- POJ - 1942 D - Paths on a Grid 组合数
- POJ 1942 Paths on a Grid
- POJ 1942--Paths on a Grid
- poj 1942 Paths on a Grid (组合数学)
- POJ 1942 Paths on a Grid 组合以及处理阶乘
- poj 1942 Paths on a Grid