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 ...
随机推荐
- 8.0 vue cli自定义页面
1.新建a.html(public文件夹下)文件,并设定div的id="a" <!DOCTYPE html> <html lang=""> ...
- drools中then部分的写法
目录 1.背景 2.支持的方法 2.1 insert 插入对象到工作内存中 2.1.1 需求 2.1.2 drl文件编写 2.1.3 部分java代码编写 2.1.4 运行结果 2.1.5 结论 2. ...
- javaweb开发案例
1.实验3 (1)当运行Servlet时,碰到"空指针异常"错误怎么处理? 答:应提示用户操作有误,或设置对象值为空字符串或一个默认值,或是不执行某操作,直接跳转到其他处理中. ( ...
- pandas:聚合统计、数据分箱、分组可视化
1.聚合统计 1.1描述统计 #df.describe(),对数据的总体特征进行描述 df.groupby('team').describe() df.groupby('team').describe ...
- GraphX 图计算实践之模式匹配抽取特定子图
本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...
- Tarjan算法模板(USACO03FALL受欢迎的牛)
好文章 #include<bits/stdc++.h> using namespace std; const int N = 10010, M = 50010; int n, m; int ...
- Spire.Office激活
更新记录: 2022年5月28日 初始代码便于复用 注意:最多支持到:E-ICEBLUE Spire.Office Platinum v6.10.3 引入命名空间: using Spire.Licen ...
- 机器学习中 TP FP TN FN的概念
二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...
- 关键字——this,super,static,final
this 理解为当前对象. //测试 public static void main(String[] args){ Person person = new Person(3, "xiaoM ...
- docker安装报错failure: repodata/repomd.xml from mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.pro
1.进入 /etc/yum.repos.d 目录下,将所有有关 docker 的 repo 全部删掉 2.重新添加镜像 sudo yum-config-manager --add-repo https ...