bzoj-1128 Lam
题意:
给出一个长度为n的数列p,数列中数字两两互质;
有一个无限长的寄存器,现从p[1]开始,依次将其所有的倍数在寄存器中置为p[i];
求最后每个数字所染色区域在寄存器中占比,用一个既约分数表示;
n<=1000,p[i]<=maxint;
题解:
这傻逼题我居然傻逼了一晚上;
说白了就是一个递推,f[i]=1/p[i] *Π(p[j]-1)/p[j];
这坨东西多好推啊,要是这题输出浮点数多好;
然并卵,显然这东西乘个n次早就爆long long了;
于是要上高精度;
上高精度可不容易,这就要考虑考虑这个式子怎么求方便了;
显然Π(p[i]-1)/p[i]可以通过后缀积来搞搞,由最后面推过来;
每次只要分子分母同乘低精度就好;
而最后的f[i]也就是分母乘个p[i]的事;
然而并不能直接输出,因为题中要的是既约分数。。。
高精GCD+高精除高精?
开玩笑吧!我还能有那码力?
首先一个显然的事,如果a与c互质,b与c互质,那么a*b与c互质;
然后我们只需要将每次低精乘高精之前,对另一个高精求一下GCD;
然后低精与另一个高精除掉这个GCD,就依然保持分数为既约形式;
这样只需要低精与高精的GCD,和高精除低精了;
高精除低精不用说,况且还是保证整除;
GCD这我就逗了,被坑的去写了一个除二讨论的GCD;
这特么。。我居然以为高精度的log很小。。。
总复杂度O(n^2log(高精度))=O(n^3)四舍五入就是一个亿啊!
真是被逗的不轻,然后我就写了个√n的质因数分解。。
只要每次分出的质因数去判断高精度能不能除掉就好了;
直接加起来边模边算,反正都是同余系下;
然后这题就结束了,复杂度O(n^2√n);
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 2100
#define M 1100
#define mod 10000
using namespace std;
typedef long long ll;
struct BIG
{int a[N],top;void print(){int i=top;printf("%d",a[i--]);while(i>=0)printf("%04d",a[i--]);}bool judge(int p){int ret=0;for(int i=top;i>=0;i--){ret=(ret*mod%p+a[i])%p;}return !ret;}friend bool operator ==(BIG &a,BIG &b){memcpy(a.a,b.a,sizeof(int)*(b.top+1));a.top=b.top;}friend bool operator <(BIG &a,int b){if(a.top>=3) return 0;if(a.top==2)return (ll)a.a[2]*mod*mod+a.a[1]*mod+a.a[0]<b;if(a.top==1)return a.a[1]*mod+a.a[0]<b;if(a.top==0)return a.a[0]<b;}friend void operator -=(BIG &a,int b){a.a[2]-=b/mod/mod;a.a[1]-=b/mod%mod;a.a[0]-=b%mod;while(a.a[a.top]==0&&a.top)a.top--;}friend void operator *=(BIG &b,int a){static int i;ll index,up;for(i=0,up=0;i<=b.top;i++){index=up+(ll)a*b.a[i];b.a[i]=index%mod;up=index/mod;}while(up)b.a[++b.top]=up%mod,up=up/mod;}friend void operator /=(BIG &a,int b){static int i,up;static ll index;i=a.top,up=0;while(i>=0){index=(ll)up*mod+a.a[i];a.a[i]=index/b;up=index%b;i--;}while(a.a[a.top]==0&&a.top)a.top--;}friend int gcd(int a,BIG &b){static BIG temp;memcpy(temp.a,b.a,sizeof(int)*(b.top+1));temp.top=b.top;int ret=1;for(int i=2;i*i<=a;i++){if(a%i==0){while(a%i==0&&temp.judge(i)){a/=i;temp/=i;ret*=i;}while(a%i==0)a/=i;}}if(a!=1)if(temp.judge(a))ret*=a;return ret;}
}up[1100],down[1100];
int p[1100];
int main()
{int n,m,i,j,k;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",p+i);up[n+1].a[0]=down[n+1].a[0]=1;for(i=n;i>1;i--){up[i]==up[i+1];down[i]==down[i+1];if(p[i]-1==0){memset(up[i].a,0,sizeof(int)*(up[i].top+1));memset(down[i].a,0,sizeof(int)*(down[i].top+1));up[i].top=0;down[i].top=0;down[i].a[0]=1;}else{k=gcd(p[i]-1,down[i+1]);down[i]/=k;up[i]*=(p[i]-1)/k;}k=gcd(p[i],up[i]);up[i]/=k;down[i]*=p[i]/k;}for(i=2;i<=n+1;i++){k=gcd(p[i-1],up[i]);up[i]/=k;down[i]*=p[i-1]/k;}for(i=2;i<=n+1;i++){up[i].print();putchar('/');down[i].print();putchar('\n');}return 0;
}
bzoj-1128 Lam相关推荐
- BZOJ 1128 [POI2008]Lam 高精度
题意:链接 方法:高精度 解析: N<=1000,P<=10^9 首先因为所有数都互质. 并且后来者可以覆盖. 所以倒着搞 拿样例来说 5->1/5 3->1/5 * 4/3 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec Memory Limit: 512 MB Submit: 53 Solved: 9 [Su ...
- Python 开源项目 Top 10 精选(平均star为1128)
翻译 | SuiSui 最近,Mybridge对250个Python开源项目进行了排名,从中精选出了Top 10.这些开源项目平均star为1128,内容包括Python新利器Pipenv, 自组织映 ...
- BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...
- BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...
最新文章
- 逆战服务器在哪个文件夹,逆战的背景音乐文件夹放在哪?别说在服务器上面!...
- backup(full,diff,log)备份并清理过时备份
- 大规模数据处理的演化历程(2003-2018)
- spring.net nhibernate 分布布式事务(下)
- Redis Cluster 集群模式原理和动态扩容
- Android 屏幕尺寸知识
- YBTOJ:最短时间(长链剖分、线段树)
- vue-axios interceptors
- MySQl Modify JSON Values
- 将文件标记为 side-effect-free(无副作用)
- 华为又对这一领域下手了,网友:太难了……
- python dlib gpu ubuntu conda_Ubuntu 下编译支持 GPU 的 TensorFlow 和 Dlib
- html中radio实现互斥
- C# 使用VS建立数据库并使用
- mybatis sql 按照特定的字段顺序排序,按照拼音首字母排序
- 永恒python配合什么主武器_「和平精英武器组合」游戏的主副武器应该怎么搭配?这三种配合让你战斗力提升...
- 用大白话谈谈XSS与CSRF
- 网络通信优化之通信协议:如何优化RPC网络通信?
- 网狐精华版后台修改记录
- hibernate报错could not insert