原文链接https://www.cnblogs.com/zhouzhendong/p/CF542D.html

题目传送门 - CF542D

题目传送门 - 51Nod1477

题意

  定义公式 $J(x) = \sum_{1 \leq k \leq x 且 k|x 且 \gcd (k,x/k) = 1} k$ 。

  现在给定一个整数 $A$ ,要求有多少正整数 $x$ ,满足 $J(x)=A$ 。

  $x|n$ 表示 $x$ 是 $n$ 的因子。

  $\gcd(a,b) 表示 $a$ 和 $b$ 的最大公约数。

  $1\leq A\leq 10^{12}$

题解

  先考虑如何求 $J(x)$ 。

  由于 $\gcd(k,x/k)=1$ ,所以选出来的 $x$ 和 $x/k$ 的质因数集合没有交集。

  故如果设 $x=\prod p_i^{a_i}$ ,那么 $J(x) = \prod (p_i^{a_i}+1)$ 。

  于是我们考虑 dfs 枚举 A 的因数分解方式,加一些剪枝和优化就可以过了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=1000005;
LL n;
struct hash_map{
static const int Ti=233,mod=1<<21;
int cnt,nxt[mod+1],fst[mod+1];
LL k[mod+1],v[mod+1];
int Hash(LL x){
int v=x&(mod-1);
return v==0?mod:v;
}
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
LL &operator [] (LL x){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x)
return v[p];
k[++cnt]=x,nxt[cnt]=fst[y],fst[y]=cnt;
return v[cnt]=0;
}
}check,use;
LL prime[N],pcnt,vis[N];
void get_prime(){
memset(vis,0,sizeof vis);
pcnt=0;
for (int i=2;i<N;i++){
if (vis[i])
continue;
prime[++pcnt]=i;
for (int j=i+i;j<N;j+=i)
vis[j]=1;
}
}
int Check(LL x){
if (x<=1)
return 0;
for (int i=1;prime[i]*prime[i]<=x&&i<=pcnt;i++)
if (x%prime[i]==0){
while (x%prime[i]==0)
x/=prime[i];
return x==1?prime[i]:0;
}
return x;
}
LL ans=0;
LL fac[N*2],fc=0;
void dfs(LL n,LL *d){
if (*d>n)
return;
if (check[n]&&!use[check[n]])
ans++;
if (*d>=n/ *d)
return;
for (;*d<n/ *d;d++){
if (n%*d)
continue;
LL &v=use[check[*d]];
if (!v)
v=1,dfs(n/ *d,d+1),v=0;
}
}
int main(){
get_prime();
n=read();
if (n==1)
return puts("1"),0;
check.clear();
for (LL i=1;i*i<=n;i++){
if (n%i)
continue;
LL j=n/i;
check[i]=Check(i-1);
check[j]=Check(j-1);
if (check[i])
fac[fc++]=i;
if (i!=j&&check[j])
fac[fc++]=j;
}
use.clear();
sort(fac,fac+fc);
fac[fc]=n+1;
dfs(n,fac);
printf("%lld",ans);
return 0;
}

  

Codeforces 542D Superhero's Job 数论 哈希表 搜索的更多相关文章

  1. 集合&gt;哈希表类Hashtable和SortedList排序列表类

    集合>哈希表类Hashtable Hashtable一种键值对的集合 ,哈希表内部的排列是无序的,而且哈希表没有提供排序方法. 集合>哈希表类Hashtable>构造普通哈希表 代码 ...

  2. [CodeForces - 1225D]Power Products 【数论】 【分解质因数】

    [CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...

  3. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  4. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  5. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  6. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  7. ELF Format 笔记(十五)—— 符号哈希表

    ilocker:关注 Android 安全(新手) QQ: 2597294287 符号哈希表用于支援符号表的访问,能够提高符号搜索速度. 下表用于解释该哈希表的组织,但该格式并不属于 ELF 规范. ...

  8. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  9. 什么叫哈希表(Hash Table)

    散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...

随机推荐

  1. 彻底搞透OAuth 2.0

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...

  2. jQuery对url的操作

    // 修改URL中指定参数的值 function changeURLArg(url,arg,arg_val){ var pattern=arg+'=([^&]*)'; var replaceT ...

  3. kotlin学习笔记-异常好玩的list集合总结

    不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 fun testList(){ var StringVal = "12_12_13_15_a_b_c_d_yu_ ...

  4. Net 4.5 WebSocket 在 Windows 7, Windows 8 and Server 2012上的比较以及问题

    Net 4.5 WebSocket在Windows 8, Windows 10, Windows Server 2012可以,但是在Windows 7, 就会报错. 错误1.“一个文件正在被访问,当前 ...

  5. Confluence 6 数据库表-杂项(Miscellaneous)

    这些部分是一些其他的表格,这些表格有必要在这里提及下能帮你更好的了解系统. os_propertyentry 有关实体和属性相关的特性. bandana 所有的持久层.这个表格包含的的内容有用户设置和 ...

  6. Confluence 6 导入模板的定义

    模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...

  7. python并发编程之多线程1

    一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...

  8. javaWeb锁屏的简单实现

    简单介绍:需求上有个小功能,用户登录后点击用户名,可以点击锁屏,锁屏解除,需要输入正确的密码才能进入管理后台页面enheng(*/ω\*)(*/ω\*)(*/ω\*) 思路简介:其实刚看到要做锁屏,第 ...

  9. git教程笔记(二)

    1.首先进入自己的项目文件 在GitHub上申请一个自己的账户信息.创建一个Repository.然后复制仓库的地址在gitbush中进行clone gitbush中进行远程clone 2.gitbu ...

  10. 2017-2018-2 20165314实验二《Java面向对象程序设计》实验报告

    实验报告封面 实验一 实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习提交最后三个JUnit测试用例 ...