5.10 NOI 模拟
最近总是管不住自己摆烂,没法像\(Zwaire\)一样管住自己,摆完之后会有负罪感,一直恶性循环,认识到了这个问题,我希望能逐渐改正(不对,马上放假了,不如摆烂到放假)
话说\(GD,HN\)的老哥都太强了吧,联考根本打不过啊\(QAQ\)
\(T1\)
建图拆点跑匹配都很容易想到,考场上审题不清导致\(RE\)
实际代码可以拿\(20pts\)(枚举质数\(+\)带花树匹配)
//csl1:边上放的一定是最大公因数的约数
//csl2:首先每个因子是互不干扰的,可以单独计算
//枚举质数,把合法的数字提出来
//无解,一个点周围没有任何点
//有解,中间是两个的,两边是一个的
//可以把图分成一条链或者一个环的形式即可
//反正都要满足,那么随机配一下就好,大胆猜测,存在即合法
//猜测失败,但是可以拆点匹配,不会带花树,随机匹配得搞一下轮数...
//但是可用的质数是不是有点多?
#include<bits/stdc++.h>
#define int long long
#define MAXN 1000000
#define MAXM 5005
using namespace std;
int Fin[MAXN+5],a[MAXN+5],PRIID,cnt,n,m;
map<int,int>id;
int l,r,zz,NOW,vis1[MAXM],q[MAXM],pre[MAXM],h[MAXM],fa[MAXM],c[MAXM],fl[MAXM];
vector<int>e[MAXM];
int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); }
int lca(int u,int v) { for(zz++;fl[u]^zz;swap(u,v)) if(u) fl[u]=zz,u=find(pre[h[u]]); return u; }
void blo(int u,int v,int rt) { for(;find(u)^rt;u=pre[v]) { pre[u]=v,fa[u]=fa[v=h[u]]=rt; if(c[v]&1) c[q[++r]=v]=2; } }
bool bfs(int u) {
for(iota(fa,fa+1+NOW,0),fill(c,c+1+NOW,0),c[q[l=r=1]=u]=2;l<=r;u=q[++l]) for(int v:e[u]) if(!c[v]) {
pre[v]=u; c[v]=1; c[q[++r]=h[v]]=2; if(!h[v]) { for(;u;v=u) u=h[pre[v]],h[h[v]=pre[v]]=v; return 1; }
} else if(c[v]==2) { int l=lca(u,v); blo(u,v,l); blo(v,u,l); } return 0;
}
map<int,int>pri;
vector<int>rd[MAXN],ID[MAXN];
map<int,vector<pair<int,int> > >Eve;
map<pair<int,int>,int>RDNUM;
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1,u,v;i<=m;i++)
{
scanf("%lld%lld",&u,&v);
// if(n==10&&i>24)cout<<u<<" "<<v<<"\n";
rd[u].push_back(v);
rd[v].push_back(u);
if(u>v) swap(u,v);
RDNUM[make_pair(u,v)]=i;
Fin[i]=1;
}
for(int i=1;i<=n;i++)
{
int res=a[i];
map<int,int>Had;
for(int j=2;j*j<=a[i];j++)
{
if(res%j==0)
{
while(res%j==0) res/=j,Had[j]++;
}
}
if(res!=1) Had[res]++;
for(map<int,int>::iterator it=Had.begin();it!=Had.end();it++)
{
if(!id[it->first]) id[it->first]=++PRIID,pri[PRIID]=it->first;
Eve[id[it->first]].push_back(make_pair(i,it->second));
}
}
if(n>10)return 0;
for(int i=1;i<=PRIID;i++)
{
if(Eve[i].size())
{
memset(h,0,sizeof(h));
int cnt=0;
map<int,int>bc;
for(int j=0;j<Eve[i].size();j++)
{
int now=Eve[i][j].first;
int num=Eve[i][j].second;
}
for(int j=1;j<=n;j++) ID[j].clear();
for(int j=0;j<Eve[i].size();j++)
{
int now=Eve[i][j].first;
int num=Eve[i][j].second;
if(num==1)
{
ID[now].push_back(++cnt);
bc[cnt]=now;
}
if(num==2)
{
ID[now].push_back(++cnt);
bc[cnt]=now;
ID[now].push_back(++cnt);
bc[cnt]=now;
}
}
for(int j=1;j<cnt;j++) e[j].clear();
for(int j=0;j<Eve[i].size();j++)
{
int now=Eve[i][j].first;
int num=Eve[i][j].second;
for(int k=0;k<rd[now].size();k++)
{
int y=rd[now][k];
for(int id1=0;id1<ID[now].size();id1++)
{
for(int id2=0;id2<ID[y].size();id2++)
{
e[ID[now][id1]].push_back(ID[y][id2]);
}
}
}
}
int Ans=0;
NOW=cnt;
for(int j=1;j<=cnt;j++) if(!h[j]&&bfs(j)) ++Ans;
// printf("Ans:%lld %lld %lld\n",pri[i],cnt,Ans);
for(int j=1;j<=cnt;j++)
{
int now=bc[j];
int y=bc[h[j]];
if(now>y) continue;
Fin[RDNUM[make_pair(now,y)]]*=pri[i];
}
if(cnt!=Ans*2)
{
cout<<-1;
return 0;
}
}
}
for(int i=1;i<=m;i++)
{
cout<<Fin[i]<<"\n";
}
}
考虑暴力枚举每个出现的质数的复杂度是\(O(Num\times n^3)\)只能过第一部分
在这里需要优化这一过程,首先考虑枚举质数,首先考虑选择一个数,什么时候可以代替这个质数,首先质数两两互质,正因为两两互质我们就可以每一个都跑一遍不影响
而且我们需要每个质数都满足,那么我们可以尝试把一些质数乘到一起看做一个新的质数跑一遍相同的过程就好了,至于乘起来需要满足什么条件,首先新的数字也要满足独立(不只是两两互质),然后对于取出来的数进行匹配就好了
\(T2\)
答案是\(C(n-1,k-1)\times \phi(n)\)
其实对于组合数敏感一点能猜出来,可惜我并没有,还是需要加强练习
话说我每次都是被这种猜结论题区分,心态炸裂
\(T3\)
考场上想到了回滚莫队\(+\)并查集\(O(n\sqrt n)\)做法,实现麻烦就写了两个\(sub\)的暴力
下了场一看,\(O(n\sqrt n)\)只能\(45pts...\)
正解待补
5.10 NOI 模拟的更多相关文章
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- 2016. 4.10 NOI codevs 动态规划练习
1.codevs1040 统计单词个数 1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 De ...
随机推荐
- 制造企业信息化时代,SaaS系统下沉,移动端上升
这个时代,我们是不是有很多岗位一定是要在电脑前面完成?如果我们让部分岗位的办公室人员离开电脑,让他们通过移动端来完成工作,这又会产生出一个什么样的变化?是否意味着可以有更多的时间在一线生产制造现场,从 ...
- python基础学习6
Python的基础学习6 内容概要 while + else 死循环.while的嵌套 for循环基本使用 range关键字 for循环补充.爬虫 基本数据类型及内置方法 内容详情 while + e ...
- 【Redis】事件驱动框架源码分析
aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...
- 修改jupyter notebook文件保存目录
我们安装好jupyter notebook之后,打开的默认地址是在C盘,文件保存的文字也是C盘,会有其它乱七八糟的东西放一起,很不方便,所以可以换一个保存位置 1. 首先,在要存放文件的位置新建文件夹 ...
- LayUI+SSM实现一个简单的后台管理系统
该后台管理系统是用于管理视频网站数据的,目前分5个菜单项,这篇博客主要讲述[影片管理]的具体功能和实现 后台代码结构和[影片管理]的界面如下图 该界面分为上下2部分,[搜索条件]和[影片列表],2部分 ...
- 【python基础】第11回 数据类型内置方法 02
本章内容概要 列表内置方法 字典内置方法 元组内置方法 集合内置方法 可变类型与不可变类型 本章内容详细 1.列表内置方法 list 列表在调用内置方法之后不会产生新的值 1.1 统计列表中的数据值的 ...
- ERROR: manifest for elasticsearch:latest not found: manifest unknown: manife
当我们用docker下载 elasticsearch 的时候出现如下错误: 这里错误的原因是没有发现最新版,需要我们指定版本. docker pull elasticsearch:7.12.0 那我们 ...
- java SWT中Label实时刷新当前时间
同样最近在开发swt的一个项目,业务中的一个功能模块类似百度网盘的上传进度条 0/80. 即已上传0个,总共80个.效果展示要的就是实时刷新,2/80呀,15/80呀,针对这个,就有了这篇文章. 下面 ...
- PowerDesigner安装
1.双击安装包进行安装 2.选择PRC 3.一路往下就行 4.将下图文件夹中的内容覆盖安装的内容 ----------------------------------------分割线 5.安装成功 ...
- 11.4 Android Studio如何设置代理
有些网络环境下,Android Studio下载无法下载依赖,这个时候就要配置代理,至于代理的问题,大家要自己解决. 获取代理信息 一般要获取如下信息: 地址:可以是域名和IP 端口: 代理类型:常用 ...