BZOJ1128: [POI2008]Lam
题目大意:有一个无限长的序列,现在给你n个数,p1~pn,要求第i次把所有pi的倍数染成i这种颜色,问最后每种颜色占总长度的几分之几。保证pi两两互质
一个显然的做法:由于pi两两互质,所以我们可以从后向前扫,令tmp[i]=tmp[i+1]*(p[i]-1)/p[i],则ans[i]=tmp[i+1]/p[i]
显然鉴于p[i]和n的大小,直接做肯定是要爆longlong的
而直接上高精度约分时间复杂度接受不了
所以当我们想求(a/b)*(C/D)时,其中C,D为高精度数并且已经约分完毕,a,b是低精度数
则我们可以让a和D约分,b和C约分,这样就转化成了高精度与低精度取gcd了
时间复杂度也就得到了保证
注意当答案为0的时候要输出"0/1"
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1010
#define M 1000000000
using namespace std;
struct ppp
{long long a[4010],clong;void jinwei(){int i;for(i=1;i<clong;i++){a[i+1]+=a[i]/M;a[i]%=M;}while(a[clong]>=M){clong++;a[clong]=a[clong-1]/M;a[clong-1]%=M;}while(a[clong]==0&&clong>1) clong--;}void print(){int i;printf("%d",a[clong]);for(i=clong-1;i>=1;i--)printf("%09d",a[i]);}
};
void make(ppp &x,int y)
{x.clong=1;x.a[1]=y;
}
int operator %(const ppp &x,int y)
{long long ret=0;int i;for(i=x.clong;i>=1;i--)ret=(ret*M+x.a[i])%y;return (int)ret;
}
ppp ret;
ppp operator *(const ppp &x,int y)
{int i;for(i=1;i<=ret.clong;i++)ret.a[i]=0;ret.clong=x.clong;for(i=1;i<=x.clong;i++)ret.a[i]=x.a[i]*y;ret.jinwei();return ret;
}
ppp operator /(const ppp &x,int y)
{int i;for(i=1;i<=ret.clong;i++)ret.a[i]=0;long long tmp=0;ret.clong=x.clong;for(i=x.clong;i>=1;i--){tmp=tmp*M+x.a[i];ret.a[i]=tmp/y;tmp%=y;}ret.jinwei();return ret;
}
int a[N];
ppp A[N],B[N];
ppp tmpa,tmpb;
int gcd(int a,int b)
{if(!a) return b;return gcd(b%a,a);
}
int gcd(int a,const ppp &b)
{int tmp=b%a;return gcd(a,tmp);
}
int main()
{int n;scanf("%d",&n);int i,j,x,y;for(i=1;i<=n;i++)scanf("%d",&a[i]);make(A[n],1);make(B[n],a[n]);make(tmpa,a[n]-1);make(tmpb,a[n]);int D=0;for(i=n-1;i>=1;i--){x=a[i]-1;y=a[i];int X,Y;if(x!=0){X=gcd(x,tmpb);Y=gcd(y,tmpa);x/=X;y/=Y;A[i]=tmpa/Y;B[i]=tmpb*y;tmpa=A[i]*x;tmpb=B[i]/X;}else{D=i-1;A[i]=tmpa;B[i]=tmpb;break;}}for(i=1;i<=D;i++)puts("0/1");for(i=D+1;i<=n;i++){A[i].print();printf("/");B[i].print();puts("");}
}
BZOJ1128: [POI2008]Lam相关推荐
- BZOJ 1128 [POI2008]Lam 高精度
题意:链接 方法:高精度 解析: N<=1000,P<=10^9 首先因为所有数都互质. 并且后来者可以覆盖. 所以倒着搞 拿样例来说 5->1/5 3->1/5 * 4/3 ...
- bzoj-1128 Lam
题意: 给出一个长度为n的数列p,数列中数字两两互质: 有一个无限长的寄存器,现从p[1]开始,依次将其所有的倍数在寄存器中置为p[i]: 求最后每个数字所染色区域在寄存器中占比,用一个既约分数表示: ...
- bzoj1131[POI2008]Sta*
bzoj1131[POI2008]Sta 题意: 给出一个n个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大.n≤1000000. 题解: 两次dfs.第一次dfs维护子树的大小.节点 ...
- 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...
- [POI2008]STA-Station
之前都看过有换根dp,一直不知道是啥意思,本来弱弱树形dp都不太熟悉,不过今天工数课的时候突然想看一下,写个板子题练练吧. 对于我的理解,换根的题目一般是根不确定,而求得答案与根是谁有关,而且通过暴力 ...
- bzoj 1124 [POI2008]枪战Maf 贪心
[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 741 Solved: 295 [Submit][Status][Di ...
- BZOJ 1113: [Poi2008]海报PLA
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1025 Solved: 679 [Submit][Sta ...
- 【安全】通过LAM(ldap-account-manager)来管理OpenLDAP
文章目录 1.安装 ldap-account-manager 1.1 启动Apache的www服务 1.2 访问 1.3 配置ldap-account-manager登录密码 1.4 添加要连接的主机 ...
- bzoj 1116: [POI2008]CLO(并查集)
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1180 Solved: 649 [Submit][Statu ...
最新文章
- EXCEL中SUMIF函数介绍
- http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1895 二分
- Photoshop常用快捷键
- 企业主机安全面临的三大风险如何解?
- (王道408考研操作系统)第一章计算机系统概述-第一节4:中断和异常
- 13万张表+数亿行代码,迁移只需数小时,还是异构数据库
- 从source folder 下将其所有子文件夹的*.* 文件拷贝到 target folder (不拷贝文件夹名仅拷贝文件)...
- 【转】 谈谈C++中的swap函数
- 4599 的 iPhone 11,拼多多如何从「真香」到「更香」
- 第一次使用pyqt5解决的几个小问题
- mysql执行语句返回主键_mysql语句insert后返回主键
- 最佳牛围栏题解 二分答案
- mac 安装ffmpeg以及各种编码器
- 南昌大学超级计算机,南昌大学-理学院
- xilinx FPGA IOB约束使用以及注意事项
- 内角均为120度六边形面积求解(xdoj 1118)
- [转载]中国移动深度定制首推“0元购TD手机”补贴政策
- Josh 的学习笔记之数字通信(Part 4——带通调制和解调)
- SWUST OJ492: 荷兰国旗问题
- LeeCode1715. 苹果和橘子的个数