首页 > 其他分享 >Codeforces Round 885 (Div. 2)E. Vika and Stone Skipping(数学,质因数分解)

Codeforces Round 885 (Div. 2)E. Vika and Stone Skipping(数学,质因数分解)

时间:2023-08-28 12:33:21浏览次数:50  
标签:std PRIME Stone 因数分解 885 int sum 因子 mod

题目链接:https://codeforces.com/problemset/problem/1848/E

 

大致题意:

 

打水漂,某人在海岸线以 f (正整数)的力量扔出石头,会在f,f+(f-1),f+(f-1)+(f-2),........,f+(f-1)+.....+2+1,的位置接触水面;

 

现在给出坐标x和q次询问,每次询问给出一个y值,将x = x*y;假设石头在x的位置接触水面,问有多少种力量的可能?

 

答案模M,保证M是一个质数;

 

解题思路:

 

如果你对于数字比较敏感的话,那么应该会发现结果和x的奇因子个数有关;

 

下面贴个官方的证明(某佬翻译过来的):

 

 

 

那么接下来,我们就需要记录x的奇因子的个数,这个可以用map来记录;

 

当然,这还不够,因为M可以比较小,那么就会出现奇因子个数是M的倍数,导致结果为0,然后那个奇因子下次增加后不是M倍数,但是因为答案上次是0,会导致一直是0,导致出错;

 

所以,我们需要额外的俩个变量来标记一下,具体可以看代码来理解一下;

 

时间复杂度:O(nlogn);

 

代码:

#include<bits/stdc++.h>
#define int long long

int x, T, mod, ans, res, p;//p和res是额外的变量,与奇因子个数为M的倍数时相关处理有关
std::map<int, int>mp, pre;

const int N = 1e6 + 6;
int PRIME[N + 6];
std::vector<int> prime;

void KSFJZYS()//快速分解质因数
{
    for (int i = 2; i <= N; ++i)
    {
        if (!PRIME[i]) { PRIME[i] = i; prime.push_back(i); }
        for (auto p : prime)
        {
            if (p * i > N)break;
            PRIME[i * p] = p;
            if (i % p == 0)break;
        }
    }
}

int QPOW(int a, int b)
{
    int sum = 1;
    while (b)
    {
        if (b & 1)sum = sum * a % mod;
        b >>= 1; a = a * a % mod;
    }
    return sum;
}

int inv(int a) { return QPOW(a, mod - 2); }

void GO(int a)
{
    std::map<int, int> m;
    while (a != 1)m[PRIME[a]]++, a /= PRIME[a];//本处是分解质因数

    for (auto [u, v] : m)//计算过程
    {
        if (u == 2 || v == 0)continue;
        int I = mp[u] + 1;
        //std::cout << u << " " << I << " " << v << "\n";
        ans = ans * inv(I) % mod;
        if ((I % mod) == 0)if ((p -= 1) == 0)ans = res;
        I += v;
        if ((I % mod) != 0 && p)res = res * I * ((I - v) % mod ? inv(I - v) : 1) % mod;
        if ((I % mod) == 0)res = res * inv(I - v) % mod, p++;
        //std::cout << p << " " << res << " " << ans << "s\n";
        ans = ans * I % mod;
        mp[u] = I - 1;
        if (ans)res = ans;
    }
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); std::cout.tie(0);

    KSFJZYS();

    std::cin >> x >> T >> mod;
    ans = 1; res = 1;

    for (int i = 2; i * i <= x; ++i)
        while (x % i == 0)mp[i]++, x /= i;

    if (x != 1)mp[x]++;

    for (auto [u, v] : mp)if (u != 2)ans = ans * (v + 1) % mod;
    res = ans;

    while (T--)
    {
        int a = 0;
        std::cin >> a;

        GO(a);

        std::cout << ans << "\n";
    }

    return 0;
}

本题难点在于看出结果和x的奇因子个数有个,然后还要处理M这个模数比较小的问题:)

标签:std,PRIME,Stone,因数分解,885,int,sum,因子,mod
From: https://www.cnblogs.com/ACMER-XiCen/p/17659925.html

相关文章

  • Codeforces Round 885 (Div. 2) F. Vika and Wiki(数学,倍增)
    题目链接:https://codeforces.com/problemset/problem/1848/F 大致题意:长度为n(n是2的幂次),每轮让a【i】=a【i】^a【i%n+1】,(^为异或)问需要操作多少次后可以使得每个数为0; 解题思路:我们来观察:第一次相当于:a【i】=a【i】^a【i+1】,a【i+1】=a【i+1】^a【i+2】第二次......
  • StoneDB 读、写操作的执行过程
    StoneDB是一款兼容MySQL的开源HTAP数据库。StoneDB的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权限验证;服务层提供了SQL接口、查询缓存、解析器、优化器、执行器等组件;Tianmu引擎所在的存储引擎层是StoneDB的核心,数据的组织......
  • StoneDB首席架构师李浩受邀采访:浅谈KPI与开源的可持续发展,认可长期主义很重要
    编者荐语:<br>StoneDB开源社区PMC、首席架构师李浩老师近期接受了ITPUB的采访,本文是对众多采访嘉宾的汇编,李浩老师对KPI与开源提出了独特见解,推荐大家阅读。<br>以下文章来源于ITPUB,作者李雪薇近年来,全球开源生态迈向高速发展的崭新阶段,很多企业、社区和个人都将关注点......
  • 磨刀不误砍柴工,数据压缩,带来的可不止空间节省 | StoneDB数据库观察
    谈到数据仓库,必然都会涉及海量历史数据,但是对于历史数据有个共识,就是越近的数据访问频率越高,越久远的数据访问频率越低。作者 | 祁国辉编辑&设计|宇亭责编 | 韩  楠当历史数据访问频率低到一定程度,我们就会发现数据的存储成本和收益开始倒挂,存储数据有点得不......
  • 哪篇论文宣布了 HTAP 数据库的诞生? StoneDB带您解读《A Common Database Approach for
    theme:condensed-night-purple开启掘金成长之旅!这是我参与「掘金日新计划·12月更文挑战」的第4天,点击查看活动详情本文是 StoneDB学术分享会专栏的第五篇,我们来分享一下HTAP学术界上比较经典的一篇论文《ACommonDatabaseApproachforOLTPandOLAPUsinganIn-M......
  • 主流开源分析引擎梳理,看看你最中意谁?| StoneDB数据库观察
    编者荐语:本文来自石原子合伙人祁国辉老师,主要对主流的开源分析引擎进行详尽的分析,干货满满,欢迎大家阅读学习。最近一段时间,我重新梳理了一下目前市面上主流的数据分析引擎,发现真是琳琅满目,令人眼花缭乱。静下心来花了两周时间横向看了一下,学习过程中,记了一些笔记,希望能够......
  • StoneDB 源码解读系列|Tianmu 引擎工具类模块源码详解(一)
    StoneDB源码解读系列文章正式开启,预计以周更的形式跟大家见面,请多多支持~本篇源码解读内容已进行直播分享,可在视频号观看直播回放,也可点击阅读原文跳转至B站观看回放视频。PPT内容可在社区论坛中查看下载:https://forum.stonedb.io/t/topic/89各个工具类属于Tianmu引擎......
  • HCSA(Hillstone)——接口与路由技术
    接口技术接口种类lHillstone设备具有多种类型接口,分为物理接口和逻辑接口:(1)物理接口:每一个以太网接口表示一个物理接口。例如ethernet0/1(2)逻辑接口:Vswitchif接口、子接口、VLAN接口、隧道接口、集聚接口、冗余接口l根据接口所处安全域还可以分为二层接口和三层接口IP类型静态IP在Web......
  • 超实用的两款截图工具(FastStone Capture 和 Snipaste)
    目录一、概述1)FastStoneCapture2)Snipaste二、FastStoneCapture和Snipaste截图软件安装一、概述"FastStoneCapture"和"Snipaste"都是计算机上常用的截图工具,用于捕捉屏幕截图、编辑图像以及进行屏幕注释等操作。下面是关于这两个工具的简要介绍:1)FastStoneCapture"Fas......
  • 快照隔离级别原理 | StoneDB 技术分享 #1
    设计:小艾审核:丁奇编辑:宇亭作者:罗中天(花名:德里克)浙江大学在读硕士、StoneDB内核研发实习生ANSISQL-92标准中规定了四种事务隔离级别和三种异象:读未提交(ReadUncommitted)、读已提交(ReadCommitted,简称RC)、可重复读(RepeatableRead,简称RR)和串行化(Serializable),其中读......