Skip to content

泉州一中信息学Blog

信息学奥赛技术分享博客

  • 登录
  • 小学oj
  • 中学oj
  • 测试页面1
  • Toggle search form

长乐集训Day?(貌似已经进行好几天了).1

Posted on 2023年7月16日2023年7月16日 By AHA 长乐集训Day?(貌似已经进行好几天了).1无评论

长乐集训Day?(貌似已经进行好几天了).1

————我真的会谢

上午

只有T1

简化(也没简多少)一下题意:

  1. 给定一个长度为 n 的正整数序列 \left\lbrace a_i\right\rbrace 。
  2. 将这个序列分为两个非空序列 \left\lbrace s_i\right\rbrace 和 \left\lbrace t_i\right\rbrace。
  3. 要求 \operatorname{gcd}(\prod s_i ,\prod t_i )=1 (s中各个元素的乘积与t中各个元素的乘积的最大公因数为1)。
  4. 问:有几种划分方式,答案对10^9+7取模。

思路+调试过程(谢的过程):

为了保证最大公因数为1 ,所以对于任意的s_i和t_i的最大公因数只能为1 ,也就是它们不能有除了1以外的任何公因数,于是我么就可把这些数分类,把拥有相同因数(相同因数不包括1,否则所有数都在一起了)的数字划分到同一组,这个过程就可以用并查集来实现了(比赛的标题就是并查集) ,划分完组后就可以把这几个组随意放置(因为两个组的任意数之间没有除1的公因数,所以可以乱放,也就是放在s或t都可以,可以保证题目要求的条件),然后就回到组合数学了,假设这些数被分成了k 组,那么答案就是 2^k (可以理解为把k个物品放到两个箱子里,问有几种方法),通过快速幂求解。

至于分组部分,我们可以先把每个再a中的数用桶排标记了,再用线性筛素数把10^7内的所有素数筛出来,然后暴力枚举每个prime_i\times j (prime_i\times j \le \operatorname{max}(a_i)),如果prime_i\times j属于a ,那么就把prime_i\times j和prime_i 用并查集合并到一起,最后再来暴力遍历 a_1~a_n统计有几组。

完成!

这真的完了吗?答案是还没,我们没有考虑a中有1的情况,因为1不会影响两个序列中各个元素的乘积,所以放哪里都可以也就是把每个1看成单独的一组,所以答案是2^{k+cnt1} ,cnt1是a中1的个数。

好吧,其实应该是这样:

好啦,这题就完了。

这真的完了吗?当然没有,s和t非空,但答案却把它俩为空的情况算进去了,所以实际上答案应该是:

真的完了。

代码:

#include<bits/stdc++.h>
#define LL long long
#define MAXA 1000010
using namespace std;
LL mod=1000000007;

int p[MAXA];
int find(int x)
{
    if(p[x]==x) return p[x];
    return p[x]=find(p[x]);
}
void merge(int x,int y)
{
    int xx=find(x),yy=find(y);
    if(xx!=yy) p[xx]=yy;
}

LL power(int x,int y)
{
    LL ret=1LL,tmp=(LL)x;
    while(y>0)
    {
        if(y&1)
        {
            ret*=tmp;
            ret%=mod;
        }
        tmp*=tmp;
        tmp%=mod;
        y>>=1;
    }
    return ret%mod;
}

int cnt,v[MAXA],prime[MAXA];
void primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(v[i]==0)
        {
            prime[cnt++]=i;
            v[i]=i;
        }
        for(int j=0;j<cnt;j++)
        {
            if(prime[j]>v[i]||prime[j]>n/i) break;
            v[i*prime[j]]=prime[j];
        }
    }
}

void aha()
{
    int n,xi=0,ct1=0,ma=0,a[100010];
    bool fg[MAXA],tg[MAXA];
    memset(fg,false,sizeof fg);
    memset(tg,false,sizeof tg);
    cin>>n;
    for(int i=1;i<=1000000;i++)
    {
        p[i]=i;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        ma=max(ma,a[i]);
        fg[a[i]]=true;
        if(a[i]==1) ct1++;
    }
    for(int i=0;i<cnt;i++)
    {
        for(int j=1;j*prime[i]<=ma;j++)
        {
            if(fg[prime[i]*j])
            {
                merge(prime[i],prime[i]*j);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        int tmp=find(a[i]);
        if(!tg[tmp])
        {
            tg[tmp]=true;
            xi++;       
        }
    }
    if(ct1>=1) ct1--;
    cout<<(power(2,xi+ct1)-2ll)%mod<<endl;
    return;
}

int main()
{
    primes(1000000);
    int T;
    cin>>T;
    while(T--)
    {           
        aha();
    } 
    return 0;
}

但是,细心的同学一定会发现这份代码会爆零。

死因:没有文件读写

真的折磨了我好久,从莫名其妙地爆零到想要测试一下大样例才恍然大悟。

下午

只有T1

这题只要稍微思考一下就知道是要求最小生成树。按理说很简单,结果写炸了,关键是不知道为什么炸了,很谢。

总结:今天大部分时间都在调 A. 集合划分 ,大概就是编译器坏了不可以调试,然后上网又下了一个,结果点错了,带了一堆软件,接着又是细节和文件读写。OJ有点卡测评要等上好一会儿。

训练日志

文章导航

Previous Post: 讲课内容:亿些DP
Next Post: 长乐集训Day1

发表回复 取消回复

要发表评论,您必须先登录。

2025年 6月
一 二 三 四 五 六 日
 1
2345678
9101112131415
16171819202122
23242526272829
30  
« 2月    

2024常州 Class Classic OI Problems Contest cqr的长乐集训2023 CZYZ LOC New Game NOI NOIP Password Protected PM_PK Preview Problems Retrospect Selfmade Qusetion STL The end Training Uneasy Problem 蒟蒻 通报

  • 训练日志
  • 链表
  • 入门
  • 模拟
  • dfs序
  • 并查集
  • spfa
  • 最小割
  • 矩阵树定理
  • 仙人掌
  • BSGS
  • 凸包
  • 回文自动机
  • 递推与动归
  • 堆
  • 莫队算法
  • ST表
  • Treap
  • 树套树
  • 可持久化线段树
  • 初赛
  • 搜索
  • 贪心
  • 深度优先搜索
  • 欧拉图
  • dijkstra
  • 费用流
  • 哈夫曼树
  • kruskual
  • 置换
  • 旋转卡壳
  • KMP
  • 区间动归
  • STL
  • 链表
  • 可并堆
  • sply
  • 主席树
  • 可持久化字典树
  • 算法
  • 动态规划
  • 构造
  • 广度优先搜索
  • 最短路
  • floyd
  • 最大流
  • 虚树
  • prim
  • 筛法
  • 半平面交
  • 字典树
  • 背包动归
  • 基础数据结构
  • 分块
  • 线段树
  • 替罪羊树
  • K-DTree
  • 图论
  • 二分法
  • 迭代搜索
  • 拓扑排序
  • 有上下界网络流
  • 生成树
  • 快速幂
  • 后缀数组
  • 树形动归
  • 哈希表
  • 中级数据结构
  • 平衡树
  • 可持久化数据结构
  • 数据结构
  • 三分法
  • 启发式搜索
  • 图的连通
  • 点分治
  • 博弈论
  • AC自动机
  • 状压动归
  • 单调栈
  • 树状数组
  • 高级数据结构
  • OI资料
  • 数学
  • 高精度
  • 差分约束
  • 树上倍增
  • 素数测试
  • 后缀自动机
  • 数位动归
  • 单调队列
  • 新闻
  • 几何
  • 随机化
  • 二分图染色
  • 树链剖分
  • 欧拉函数
  • manacher
  • 斜率优化
  • 离线处理
  • 信息学奥赛学长风采
  • 字符串
  • 二分图匹配
  • prufer编码
  • 卡特兰数
  • 密码学
  • 决策单调
  • 赛后总结
  • 其他
  • 2-SAT
  • 最近公共祖先
  • 矩阵乘法
  • 记忆化搜索
  • 网络流
  • Link cut tree
  • 排列组合
  • 树
  • 高斯消元
  • 乘法逆元
  • 容斥原理
  • 调和级数
  • 概率与期望
  • 模线性方程组
  • 莫比乌斯反演
  • 快速傅里叶变换
  • 扩展欧几里德
  • 最大公约数与最小公倍数

近期文章

  • DP杂题
  • 2025年2月13日模拟赛
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 3
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 2
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 1

近期评论

归档

  • 2025年2月
  • 2025年1月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月

Copyright © 2025 泉州一中信息学Blog.

Powered by PressBook WordPress theme