约数 求反素数bzoj1053 bzoj1257
//约数 /*
求n的正约数集合:试除法
复杂度:O(sqrt(n))
原理:扫描[1,sqrt(N)],尝试d能否整除n,若能,则N/d也能
*/
int factor[],m=;
for(int i=;i*i<=n;i++){
if(n%i==){
factor[++m]=i;
if(i!=n/i) factor[++m]=n/i;
}
} /*
求[1,n]每个数的正约数集合:倍数法
复杂度:O(nlogn)
原理:对于每个数d,[1,n]中以d为约数的数就是d的倍数
*/
vector<int> factor[];
for(int i=;i<=n;i++)
for(int j=;i*j<=n;j++)
factor[i*j].push_back(i); /*两个推论
1.一个整数的约数个数上界 为2*sqrt(n)
2.[1,n]每个数的约数个数总和大约为nlogn
*/
/*
题意有点绕
每个人手里有一个非0数字,首先第k个人出列,然后按其手里的数字让下一个人出列
循环如此,设i为小于等于N的最大反素数,问第i个出列的人的编号
打表求反素数:按质因数大小递增顺序搜索每一个质因子,枚举每一个质因子的个数
唯一分解定理,一个数的因子数:(p1+1)(p2+1)(p3+1)...
性质1:一个反素数的质因子必然是从2开始连续的质数
性质2:
1 2 3 4 6 9 12 18 36
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define inf 1<<29
int n,p[]={,,,,,,,,,,,},use[];
ll maxt,ans;//maxt是最大因子数,ans是当前的反质数
//id是素数表的下标,now是当前数字,tot是因子数,符合因子数公式
void dfs(ll id,ll now,ll tot){
if(tot>maxt)//找到了因子数更大的数
ans=now,maxt=tot;
else if(tot==maxt && now<ans)//找到因子数相同,但是数值更小的数
ans=now,maxt=tot;
use[id]=;
while(now*p[id]<=n && use[id]+<=use[id-]){//第二个是剪枝
use[id]++;
now*=p[id];
dfs(id+,now,tot*(use[id]+));
}
}
int main(){
scanf("%d",&n);
use[]=inf;
dfs(,,);
printf("%lld",ans);
return ;
}
推公式题,详见进阶指南p134
思路大概是:当i在区间[x,k/(k/x)]时,k/i的值都是一样的,那么这一段的值可以用等差数列求和公式做
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,k;
long long ans;
int main(){
scanf("%lld%lld",&n,&k);
ans=(long long)n*k;
for(int x=,gx=;x<=n;x=gx+){
gx=k/x?min(n,k/(k/x)):n;
ans-=(k/x)*(x+gx)*(gx-x+)/;//首项x*k/x,末项gx*k/x,项数gx-x+1
}
printf("%lld\n",ans);
}
约数 求反素数bzoj1053 bzoj1257的更多相关文章
- 51nod1060:最复杂的数(DFS求反素数)
把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数. 例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等,输出最 ...
- 【BZOJ1053】[HAOI2007]反素数
[BZOJ1053][HAOI2007]反素数 题面 bzoj 洛谷 题解 可以从反素数的定义看出小于等于\(x\)的最大反素数一定是约数个数最多且最小的那个 可以枚举所有的质因数来求反素数,但还是跑 ...
- zoj 1562 反素数 附上个人对反素数性质的证明
反素数的定义:对于不论什么正整数,其约数个数记为.比如,假设某个正整数满足:对随意的正整 数.都有,那么称为反素数. 从反素数的定义中能够看出两个性质: (1)一个反素数的全部质因子必定是从2開始的连 ...
- 【bzoj1053】反素数
[bzoj1053]反素数 题意 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例 ...
- BZOJ1053 [HAOI2007]反素数ant 数论
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正 ...
- 【BZOJ1053】 反素数ant
BZOJ1053 反素数ant 我们先考虑唯一分解定理求出约数个数: \(x=a_1^{p_1}a_2^{p_2}a_3^{p_3}...a_k^{p_k}\) 然后\(num=\Pi_{i=1}^k ...
- 【BZOJ1053】[HAOI2007]反素数ant 暴力
[BZOJ1053][HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) ...
- bzoj1053: [HAOI2007]反素数ant
51nod有一道类似的题...我至今仍然不会写暴搜!!! #include<cstdio> #include<cstring> #include<iostream> ...
- BZOJ1053:反素数(数学)
题目链接 对于任意的正整数\(x\),记其约数的个数为\(g(x)\).现在定义反素数:对于\(0<i<x\),都有\(g(x)>g(i)\),那么就称x为反素数. 现在给定一个数N ...
随机推荐
- JVM总结(二):JVM的内存分配策略
这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...
- logback异步输出日志(生产者消费者模型),并非批量写入日志。
一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...
- Python学习笔记10--unittest参数化
我们在写case的时候,如果用例的操作是一样的,就是参数不同,比如说要测一个登陆的接口,要测正常登陆的.黑名单用户登陆的.账号密码错误的等等,在unittest里面就要写多个case来测试. 这样的情 ...
- Python基础-day02
写在前面 上课第二天,打卡: 大人不华,君子务实. 一.进制相关 - 进制基础 数据存储在磁盘上或者内存中,都是以0.1形式存在的:即是以 二进制 的形式存在: 为了存储和展示,人们陆续扩展了数据的表 ...
- SQL Server进阶(二)字段类型
概述 系统数据类型详情 SqlDbType namespace System.Data { // // 摘要: // 指定要用于 System.Data.SqlClient.SqlParameter ...
- 基于Redis主从复制读写分离架构的Session共享(Windows Server)
搭建主从复制 1.安装软件 下载Redis-x64-3.2.100.zip:https://github.com/MicrosoftArchive/redis/releases 第一步:将Redis拷 ...
- spring注解第07课 @Valid和@Validated的总结区分
@Valid: @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于Gir ...
- Oracle——环比增长率
首先,了解什么是:环比增长率? 环比增长率=(本期数-上期数)÷上期数×100% 如:2014年2月的工资为:5000,2014年1月的工资为4000,则2月份的环比增长率为: (5000-4000) ...
- HTML5中<template>标签的详细介绍
HTML5中<template>标签的详细介绍(图文) 这篇文章主要介绍了HTML5中的template标签,是HTML5入门中的重要知识,需要的朋友可以参考 一.HTML5 templa ...
- 【Mysql sql inject】POST方法BASE64编码注入write-up
翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...