最近总是管不住自己摆烂,没法像\(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 模拟的更多相关文章

  1. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  2. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  3. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  4. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  5. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  6. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  7. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

  8. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  9. 2016. 4.10 NOI codevs 动态规划练习

    1.codevs1040 统计单词个数 1040 统计单词个数 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 De ...

随机推荐

  1. 56. Merge Intervals - LeetCode

    Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...

  2. 167. Two Sum II - Input array is sorted - LeetCode

    Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...

  3. jq命令用法总结

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 如果说要给Linux文本三剑客(grep.sed.awk)添加一员的话,我觉得应该是jq命令,因为jq命令是用来处 ...

  4. python变量名下划线

    xx: 公有变量 _x: 单前置下划线,保护变量,私有化属性或方法,不能用于'from module import *' 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其/类 ...

  5. 【Redis】集群数据迁移

    Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384. 在集群节点对应的结构体变量clusterNode中可以看到s ...

  6. mybatis踩过的坑

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  7. JavaScript易错知识点

    JavaScript易错知识点整理1.变量作用域上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. 上方的函数作用域中虽然声明并赋值了a,但位于console之下 ...

  8. SAP 隐式增强 Enhancement point

    1.进入编辑器:SE38/SE37/SE24 Edit-->Enhancement Operations-->Create Option 2.填写相关信息,点击对号. 3.点击Enhanc ...

  9. MongoDB 的内存使用限制

    本文将简述一下MongoDB的内存限制问题 1. 使用Docker限制 当我们使用docker创建mongo 容器时,可通过使用以下参数,对mongo可以使用的资源进行限制 内存限制 参数 简介 -m ...

  10. C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗

    前言 最近成功把「前端带师」带入C#的坑(实际是前端带师开始从cocos转unity游戏开发了) 某天,「前端带师」看到这段代码后问了个问题:[这个是装饰器]? [HttpGet] public Re ...