最近总是管不住自己摆烂,没法像\(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. brew常用命令

    Homebrew 常用命令 brew -help # 查看帮助命令 brew config # 查看配置信息 brew list # 查看已安装软件包列表 brew cleanup # 清理所有包的旧 ...

  2. 学习Java的第十五天——数学运算

    学习内容:数学运算 1.三角函数运算 代码实现: public class 三角函数运算 { public static void main(String[] args) { // TODO 自动生成 ...

  3. 数据库与MySQL的下载使用

    目录 数据存储演变史 数据库应用发展史 数据库本质 数据库分类 关系型数据库 非关系型数据库 SQL与NoSQL MySQL简介 版本问题 下载使用 目录结构 基本使用 简单使用 系统服务 修改密码 ...

  4. C++从静态类型到单例模式

    目录 1. 概述 2. 详论 2.1. 静态类型 2.1.1. 静态方法成员 2.1.2. 静态数据成员 2.2. 单例模式 2.2.1. 实现 2.2.2. 问题 3. 参考 1. 概述 很多的知识 ...

  5. 简历应该怎么写,HR看一篇简历仅需要5秒吗,简历模板大全

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 最近有很多小伙伴问奇哥,说奇哥 ...

  6. 【freertos】009-任务控制

    目录 前言 9.1 相对延时 9.1.1 函数原型 9.1.2 函数说明 9.1.3 参考例子 9.2 绝对延时 9.2.1 函数原型 9.2.2 函数说明 9.2.3 参考例子 9.3 获取任务优先 ...

  7. QC快速充电

    QC快充 一.高通QC快充的介绍 二.识别充电类型的芯片介绍 三.QC充电曲线 四.如何在log中看QC充电类型 五.QC3识别错误 六.波形图 一.高通QC快充的介绍 高通QC快充技术,又称Quic ...

  8. CSS3:scrollbar样式设置

    CSS3:scrollbar样式设置 1. 设置出现滚动条的方式 overflow:scroll --- x和y方向都会出现滚动条 或者 overflow-x:scroll --- 只有x方向出现滚动 ...

  9. Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束.有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束. packag ...

  10. 渗透测试之常用的sql语句

    学习路漫漫,常用的sql语句给我们平常所运用的sql语句相差不多,用句土话讲:百变不离其中 注:网络安全时刻警醒,需要打靶的还需要建立自己的靶场,关注博主在以往博客中分享有多种创建靶场可参考 1.判断 ...