当前位置: 首页 > news >正文

SCUT - 11 - 被钦定的选手 - 质因数分解

https://scut.online/p/11

T了好多次,还想用mutimap暴力分解每个数的质因数。后来记录每个数的最小质因子过了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, m, MOD;

const int SIZE = 1e6, SIZEP = 8e4;

int p2[SIZE + 5], p5[SIZE + 5];
int p[SIZEP + 5], ptop;
int minp[SIZE + 5];

void init() {
    for(int i = 2; i <= SIZE; i *= 2) {
        for(int j = i; j <= SIZE; j += i)
            p2[j] ++;
    }
    for(int i = 5; i <= SIZE; i *= 5) {
        for(int j = i; j <= SIZE; j += i)
            p5[j] ++;
    }
    minp[1] = 1;
    for(int i = 2; i <= SIZE; i++) {
        if(!minp[i]) {
            p[++ptop] = i;
            minp[i] = ptop;
        }
        for(int j = 1, t; j <= ptop && (t = i * p[j]) <= SIZE; j++) {
            minp[t] = j;
            if(i % p[j] == 0)
                break;
        }
    }
    //cout<<ptop<<endl;
}


int cntp[SIZEP + 5];

void cnt(int n, int d) {
    while(n != 1) {
        cntp[minp[n]] += d;
        n /= p[minp[n]];
    }
}

int qpow(ll x, int n) {
    ll res = 1;
    while(n) {
        if(n & 1)
            res = res * x % MOD;
        x = x * x % MOD;
        n >>= 1;
    }
    return res;
}

int calc() {
    memset(cntp, 0, sizeof(cntp));
    m = min(n - m, m);
    for(int i = 1; i <= m; ++i) {
        cnt(n - i + 1, 1);
        cnt(i, -1);
    }
    int min10 = min(cntp[1], cntp[3]);
    cntp[1] -= min10, cntp[3] -= min10;
    printf("%d ", min10);
    ll ans = 1;
    for(int i = 1; i <= ptop; ++i)
        ans = ans * (qpow(p[i], cntp[i])) % MOD;
    return ans % MOD;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    init();
    while(~scanf("%d%d%d", &n, &m, &MOD))
        printf("%d\n", calc());
}

事实上,这个是个阶乘(DQ的方法),那么阶乘以内的各个质因子的贡献是可以算出来的,具体而言,2会贡献n/2个2,4再贡献n/4个2,8再贡献n/8个2。

用上面的方法,每个质因数会贡献一个log,一共是80000logn,而我的方法则是1000000logn,而且我对p2和p5的预处理并不是线性的(后面发现这两个白处理)。

二分memset,丧心病狂。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, m, MOD;

const int SIZE = 1e6, SIZEP = 8e4;
int p[SIZEP + 5], ptop;
int minp[SIZE + 5];

void init() {
    minp[1] = 1;
    for(int i = 2; i <= SIZE; i++) {
        if(!minp[i]) {
            p[++ptop] = i;
            minp[i] = ptop;
        }
        for(int j = 1, t; j <= ptop && (t = i * p[j]) <= SIZE; j++) {
            minp[t] = j;
            if(i % p[j] == 0)
                break;
        }
    }
    //cout<<ptop<<endl;
}

int maxptop;
int cntp[SIZEP + 5];

void cnt(int n, int d) {
    /*while(n != 1) {
        cntp[minp[n]] += d;
        n /= p[minp[n]];
    }*/
    for(int i=1;i<=maxptop;++i){
        int tmp=n;
        while(tmp/=p[i]){
            cntp[i]+=tmp*d;
        }
    }
}

int qpow(ll x, int n) {
    ll res = 1;
    while(n) {
        if(n & 1)
            res = res * x % MOD;
        x = x * x % MOD;
        n >>= 1;
    }
    return res;
}

int calc() {
    maxptop=min(int(lower_bound(p+1,p+1+ptop,n)-p),ptop);
    memset(cntp, 0, sizeof(cntp[0])*(maxptop+1));
    /*m = min(n - m, m);
    for(int i = 1; i <= m; ++i) {
        cnt(n - i + 1, 1);
        cnt(i, -1);
    }*/
    cnt(n,1);
    cnt(m,-1);
    cnt(n-m,-1);
    int min10 = min(cntp[1], cntp[3]);
    cntp[1] -= min10, cntp[3] -= min10;
    printf("%d ", min10);
    ll ans = 1;
    for(int i = 1; i <= maxptop; ++i){
        if(cntp[i])
            ans = ans * (qpow(p[i], cntp[i])) % MOD;
    }
    return ans % MOD;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    init();
    while(~scanf("%d%d%d", &n, &m, &MOD))
        printf("%d\n", calc());
}

转载于:https://www.cnblogs.com/Yinku/p/11297087.html

相关文章:

  • notify官方详解
  • heartbeat与lvs和realserver的结合
  • Windows Phone 7 Silverlight开发试玩
  • 我命由我不由天
  • git用法记录
  • 模板 - 日期类
  • POJ数学题目
  • SCUT - 142 - 第n个素数
  • 敏捷开发般若敏捷系列之二:什么是敏捷(上)(无住,不住于法,破法执)...
  • C#打包应用程序
  • SCUT - 37 - 手速帝CZK - 分块
  • HDU 1166 敌兵布阵
  • babel
  • 转载 对于struct file_operations中ioctl消失的学习笔记
  • SCUT - 77 - 哈利波特与他的魔法杖
  • #Java异常处理
  • Docker 笔记(2):Dockerfile
  • eclipse的离线汉化
  • IDEA常用插件整理
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript-Array类型
  • js ES6 求数组的交集,并集,还有差集
  • Js基础知识(一) - 变量
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue自定义指令实现v-tap插件
  • 闭包--闭包之tab栏切换(四)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 计算机常识 - 收藏集 - 掘金
  • 微服务核心架构梳理
  • 项目管理碎碎念系列之一:干系人管理
  • 怎么将电脑中的声音录制成WAV格式
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • $.proxy和$.extend
  • (11)MSP430F5529 定时器B
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4)STL算法之比较
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)kafka实战——kafka源码编译启动
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转) ns2/nam与nam实现相关的文件
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat文件调用java类的main方法
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)