SCUT - 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());
}
SCUT - 11 - 被钦定的选手 - 质因数分解的更多相关文章
- 谷歌钦定的编程语言Kotlin大揭秘
第一时间关注程序猿(媛)身边的故事 谷歌钦定的编程语言Kotlin大揭秘 语法+高级特性+实现原理:移动开发者升职加薪宝典! 谷歌作为世界级的科技公司巨头,强悍的技术研发与创新能力使其一直是业界的楷模 ...
- 质因数分解的rho以及miller-rabin
一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法, ...
- 简单数论之整除&质因数分解&唯一分解定理
[整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...
- 【期望dp 质因数分解】cf1139D. Steps to One
有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...
- POJ1365:质因数分解
Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3590 Accepted: 1623 Descri ...
- codevs 3164 质因数分解
3164 质因数分解 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description (多数据)给出t个数,求出它的质因子个 ...
- Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)
Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...
- PAT 甲级 1059 Prime Factors (25 分) ((新学)快速质因数分解,注意1=1)
1059 Prime Factors (25 分) Given any positive integer N, you are supposed to find all of its prime ...
- 快速质因数分解及素性测试&ABC142D
首先,这个整数的标准分解非常的显然易见对吧: 一般我们要把一个数分解成这个样子我们可以这样写: #include<cstdio> ],w[],k; void factorize(int n ...
随机推荐
- MySQL--全文索引作用、原理及使用注意
作用 MySQL索引可以分为:主键索引.普通索引.唯一索引.全文索引.其中,全文索引应该是是比较特殊的,它只有少数的几个存储引擎支持,且只有类型为char.vchar.text的列能建立全文索引.以前 ...
- kettle imestamp : Unable to get timestamp from resultset at index 22
在做ETL的时候,连接MySQL读取含有timestamp类型的表,出现如下错误: 经Google,据说是MySQL自身的问题.解决方法也很简单,在Spoon的数据库连接中,打开选项,加入一行命令参数 ...
- .Net 网站配置文件 webconfig 配置。 字体图标+视频播放 以及 文件上传
ASP.NET MVC 上传大文件时404 原来IIS7的上传文件大小,即便是在经典模式下,也一定要在system.webServer里设置,加上去就OK了 <system.webServer& ...
- AT2370 Piling Up
https://www.luogu.org/jump/atcoder/2370 题解 答案不是\(2^{2m}\)因为每轮的第一次取球可能会不够. 我们可以设\(dp[i][j]\)表示到了第\(i\ ...
- 170911-关于maven的知识点
简介: 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的. Maven的好处? 节省空间 就是对jar包的统一管理就是对jar包的统一管理,依赖 ...
- 8 Django 模型层(2)
知识预览 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型 ...
- matlab 重命名文件和文件夹
1.查看文件存在 dir() 若存在,返回文件信息 dir(‘test.txt’) %查看当前目录是否存在test.txt文件 dir(‘C:\test.txt’) %查看指定目录是否存在 ...
- ORACLE动态监听
动态监听的原理 pmon在数据库启动到mount或open时,动态从参数文件中读取service_names值.service_names可以为多值(可以有64个,其中包括两个系统的). servi ...
- 织梦dedecms发布视频文章前台变成一张图片的解决方法
在发布文章的时候,有时需要插入视频的代码,如优酷.腾讯等视频,这样更能让文章变的丰富,但是在发布视频的时候,前台并不能播放视频,而是一张图片 解决这个方法其实很简单,在发布视频文章的时候,将附加选项的 ...
- 【tensorflow使用笔记三】:tensorflow tutorial中的源码阅读
https://blog.csdn.net/victoriaw/article/details/61195620#t0 input_data 没用的另一种解决方法:tensorflow1.8版本及以上 ...