首页 > 其他分享 >NFLS NOI模拟 序列

NFLS NOI模拟 序列

时间:2024-05-09 23:34:01浏览次数:19  
标签:char ch gcd NFLS NOI static 序列 getchar

涉及知识点:数论,图论转化建图

题意

有一串长为 \(n\ (\leq10^3)\) 序列 \(a\),给出 \(m\ (\leq10^3)\) 个条件,每条条件形如 \(\gcd(a_i,a_j)=k\),问是否存在这样的序列满足所有条件。保证不存在重复的 \((a_i,a_j)\) 对。

思路

把题目给出的所有关系建成图,点 \(i\) 代表 \(a_i\),\(\gcd(a_i,a_j)=k\) 转化为 \(i\) 连 \(j\) 边权为 \(k\) 的边。将每个节点的点权设为与它相连的所有边边权的最小公倍数,可以证明,假如条件合法,这将是最小的合法值。

然后再遍历每条边,记为 \((u,v,k)\),判断 \(u\) 和 \(v\) 点权的 \(\gcd\) 是否为 \(k\),可以发现:

  • 如果 \(k<\gcd\),因为 \(u\) 和 \(v\) 的点权已经是最小,无法再变小,因此它们的 \(\gcd\) 也不可能再变小,该情况不合法。
  • 如果 \(k=\gcd\),该情况符合题意,合法。
  • 如果 \(k>\gcd\),我们发现无法找到一个方式可以在不破坏其他边关系的情况下使 \(\gcd\) 变大,该情况不合法。

因此,判断每条边即可。

代码

#include<bits/stdc++.h>
using namespace std;
#ifdef ONLINE_JUDGE
#define getchar __getchar
inline char __getchar(){
    static char ch[1<<20],*l,*r;
    return (l==r&&(r=(l=ch)+fread(ch,1,1<<20,stdin),l==r))?EOF:*l++;
}
#endif
template<class T>inline void rd(T &x){
    T res=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while('0'<=ch && ch<='9'){res=res*10+ch-'0';ch=getchar();}
    x=res*f;
}
template<class T>inline void wt(T x,char endch='\0'){
    static char wtbuff[20];
    static int wtptr;
    if(x==0){
        putchar('0');
    }
    else{
        if(x<0){x=-x;putchar('-');}
        wtptr=0;
        while(x){wtbuff[wtptr++]=x%10+'0';x/=10;}
        while(wtptr--) putchar(wtbuff[wtptr]);
    }
    if(endch!='\0') putchar(endch);
}
typedef long long LL;
typedef __int128_t int128;
const int MAXN=1e3+5;
int n,m,head[MAXN],ecnt=1;
int128 val[MAXN];
struct EDGE{
    int v,nxt;
    int128 w;
}e[MAXN<<2];
inline void add(const int& u,const int& v,const int128& w){
    e[++ecnt].v=v;
    e[ecnt].w=w;
    e[ecnt].nxt=head[u];
    head[u]=ecnt;
}
inline int128 __lcm(int128 x,int128 y){
    return x*y/__gcd(x,y);
}
inline void solve(){
    memset(head,0,sizeof(head));
    ecnt=1;
    
    rd(n);rd(m);
    for(int i=1,u,v;i<=m;i++){
        int128 w;
        rd(u);rd(v);rd(w);
        add(u,v,w);add(v,u,w);
    }

    for(int i=1;i<=n;i++){
        val[i]=1;
        for(int j=head[i];j;j=e[j].nxt){
            val[i]=__lcm(val[i],e[j].w);
        }
    }

    for(int i=2;i<=ecnt;i+=2){
        if(__gcd(val[e[i].v],val[e[i^1].v])!=e[i].w){
            puts("No");
            return;
        }
    }
    puts("Yes");
}
int main(){
    int t;
    rd(t);
    while(t--) solve();
    return 0;
}

标签:char,ch,gcd,NFLS,NOI,static,序列,getchar
From: https://www.cnblogs.com/SkyNet-PKN/p/18183327

相关文章

  • NFLS NOI模拟 Mizuki 与进化
    涉及知识点:贪心,疑似Ad_hoc题意给你一个只包含ABC的长度为\(2n\)的字符串,问能否将该字符串划分为\(n\)个子序列,子序列只能是ABACBC中的一个,或输出无解。思路设ABC的个数分别为\(a,b,c\),为ABACBC的子序列个数分别为\(cnt_{AB},cnt_{AC},cnt_{BC}\),那么有......
  • NFLS NOI模拟 大战波特
    涉及知识点:贪心前言思维难度不高,就是挺好玩的,随手记录下有意思的贪心,奇妙的贪心经常比复杂的DP还有意思。题意打Boss,总共可以打\(n\(\leq10^6)\)回合,每回合可以普攻一次,造成\(x\)点伤害,每回合可以使用咒语,总共最多使用\(k\)次,使得Boss赋予一层“中毒”效果,并减弱......
  • 洛谷 P1031 [NOIP2002 提高组] 均分纸牌 题解
    题目简述有$N$堆纸牌,编号分别为$1,2,\ldots,N$。每堆上有若干张,但纸牌总数必为$N$的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为$1$堆上取的纸牌,只能移到编号为$2$的堆上;在编号为$N$的堆上取的纸牌,只能移到编号为$N-1$的堆上;其他堆上取的纸牌,可......
  • 洛谷 P1012 [NOIP1998 提高组] 拼数 题解
    题目简述设有$n$个正整数$a_1\dotsa_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。题目分析定义设$X$为数字$x$的字符串形式。$A+B$表示字符串$A$和字符串$B$相连组成的字符串。思路既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行......
  • xor序列 线性基
    xor序列线性基题目链接题意:给你\(n\)个数,接着给你\(m\)次询问,每次给出\(x\)和\(y\),判断\(x\)能否与\(n\)个数中任意选出的数异或和为\(y\)思路:考虑异或运算性质若\(a\)^\(b\)=\(c\),那么\(b=a\)^\(c\)。因此我们只需要找出\(n\)个数异或和是......
  • Apache Commons Collections反序列化漏洞
    目录复现环境准备POC漏洞原理分析构造反射链TransformedMap利用链ApacheCommonsCollections的反序列化漏洞在2015年被曝光,引起了广泛的关注,算是java历史上最出名同时也是最具有代表性的反序列化漏洞。复现环境准备jdk1.7版本下载压缩包链接:https://pan.baidu.com/s/......
  • 基于深度卷积神经网络的时间序列图像分类,开源、低功耗、低成本的人工智能硬件提供者
    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然大多数时间序列分类(TSC)文献都集中在1D信号上,但本文使用递归图(RP)将时间序列转换为2D纹理图像,然后利用深度CNN分......
  • leetCode 128. 最长连续序列
    给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=[0,3,7,......
  • 最长子序列
    为了解决这个问题,我们可以使用滑动窗口的方法。滑动窗口可以让我们在不需要嵌套循环的情况下遍历序列中所有的连续子序列。以下是这个方法的步骤:初始化两个指针start和end,都指向序列的开始。初始化当前和current_sum为0。移动end指针,每次移动都将end指向的值加到c......
  • python教程6.3-json序列化
    序列化:dumps,编码,将python类型转成json对象反序列化:loads,解码,将json对象转成python对象pickle模块提供了四个功能:dumps、loads、dump、load(前2个操作变量,后2个操作文件)jsonjson模块也提供了四个功能:dumps、dump、loads、load,⽤法跟pickle⼀致。(前2个操作变量,后2个操作文件)......