洛谷——P1743 矩阵 III
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——P1743 矩阵 III相关的知识,希望对你有一定的参考价值。
P1743 矩阵 III
题目背景
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; }
以上是关于洛谷——P1743 矩阵 III的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P3663 [USACO17FEB]Why Did the Cow Cross the Road III S
洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)
矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)