【xsy2815】净空 大暴力
绝了场上居然没做这一题
题目大意:给你一个数x=Πni=1ai!。
你需要将x表示为x=Πmi=1(ci!)dip
满足p无法再分解,且(c1,d1,c2,d2,...,cm,dm)的字典序最大。
数据范围:1≤n,ai≤105。
我们考虑预处理出105内的质数。
读入数列a后,我们对数列a进行一些处理。令sum[i]表示数列a中出现了多少个质因子p[i],其中p[i]表示第i个质数。
然后,我们从大到小枚举ci,然后再判断di是否可行。
这么搞复杂度貌似是O(n2ln n)的,然而实际上它跑得飞快?
1 #include<bits/stdc++.h> 2 #define M 100010 3 #define L long long 4 using namespace std; 5 6 int pri[M]={0},las[M]={0},id[M]={0},use=0; 7 void init(){ 8 for(int i=2;i<M;i++){ 9 if(!las[i]) id[pri[++use]=i]=use,las[i]=1; 10 for(int j=1;j<=use&&i*pri[j]<M;j++){ 11 las[i*pri[j]]=i; 12 if(i%pri[j]==0) break; 13 } 14 } 15 } 16 17 L a[M]={0},sum[M]={0},now[M]={0}; 18 int ansx[M]={0},ansy[M]={0},cnt=0,top=0; 19 bool cmp(){ 20 for(int i=top;i;i--) 21 if(sum[i]<now[i]) return 0; 22 return 1; 23 } 24 25 int main(){ 26 init(); top=use; 27 int n; scanf("%d",&n); 28 for(int i=n,x;i;i--) scanf("%d",&x),a[x]++; 29 for(int i=M-2;i;i--) a[i]+=a[i+1]; 30 for(int i=M-1;i;i--){ 31 for(int j=i;j>1;j=las[j]){ 32 int p=id[j/las[j]]; 33 sum[p]+=a[i],now[p]++; 34 } 35 } 36 for(int i=M-1;i>1;i--){ 37 if(cmp()){ 38 L mns=M; 39 for(int j=top;j;j--) if(now[j]) mns=min(mns,sum[j]/now[j]); 40 for(int j=top;j;j--) sum[j]-=now[j]*mns; 41 cnt++; ansx[cnt]=i; ansy[cnt]=mns; 42 } 43 for(int j=i;j>1;j=las[j]){ 44 int p=id[j/las[j]]; 45 now[p]--; 46 } 47 while(top&&now[top]==0) top--; 48 } 49 printf("%d\n",cnt); 50 for(int i=1;i<=cnt;i++) printf("%d %d\n",ansx[i],ansy[i]); 51 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2018-03-19 【2018北京集训6】Lcm DFT&FWT