codevs1009
来源:互联网 发布:数控切割机用u盘编程 编辑:程序博客网 时间:2024/06/05 14:51
题目地址:http://codevs.cn/problem/1009/
分析:
【TAG】FLOYD,乘法原理,高精度
【构思】
求可变换数的个数,那么就是组合数学的内容,四个原理的应用;
假如能知道每位的变换个数,那么乘起来就是结果;
于是用FLOYD来求传递闭包,每个数可以变换成其他哪些数,然后累加;
最后相乘,注意要高精度;
【小结】
1、求个数:组合数学,最本质的求法其实就是加法原理、减法原理、乘法原理和除法原理
2、对于超长的数字,当做字符串处理
3、求连通个数的问题,用Floyd求出传递闭包后解决
代码:
var a,ans:array[1..30] of longint;f:array[0..9] of longint;g:array[0..9,0..9] of boolean;m,n,i,j,t,k:longint;s:string;beginfillchar(g,sizeof(g),false);fillchar(f,sizeof(f),0);fillchar(ans,sizeof(ans),0);readln(s);n:=0; m:=0; i:=1;while s[i] in ['0'..'9'] dobegininc(n); a[n]:=ord(s[i])-48; inc(i);end;while i<=length(s) dobeginif s[i] in ['0'..'9'] then m:=m*10+ord(s[i])-48;inc(i);end;for i:=1 to m dobeginreadln(t,j); g[t,j]:=true;end;for k:=0 to 9 dofor i:=0 to 9 dofor j:=0 to 9 dog[i,j]:=g[i,j] or (g[i,k] and g[k,j]);for i:=0 to 9 do g[i,i]:=true;for i:=0 to 9 dofor j:=0 to 9 doinc(f[i],ord(g[i,j]));ans[1]:=1;for k:=1 to n dobeginj:=0;for i:=1 to 30 dobeginans[i]:=ans[i]*f[a[k]]+j;j:=ans[i] div 10;ans[i]:=ans[i] mod 10;end;end;j:=30;while ans[j]= 0 do dec(j);for i:=j downto 1 do write(ans[i]);writeln;end.
1 0
- codevs1009
- codevs1009 产生数
- CodeVS1009[NOIP2002(普及组)] 产生数【Floyd】
- 【日常学习】【floyd传递闭包+高精】codevs1009 产生数题解
- LeetCode #16 3Sum Closest
- 常用设备接口类GUID
- 自定义ProgressDialog显示和隐藏
- Cocos2d-x3.4 EditBox的问题
- C/C++基础知识学习
- codevs1009
- 自定义JSTL函数
- 2012年5月SAT香港真题解析
- 学生信息管理系统
- 单例设计模式
- 反射
- Spring中如何配置Hibernate事务
- 用Arduino对Apple手表进行远程红外控制
- 1/4波长天线详解