比赛的时候把公式扣出来了,,但是没有想到用筛法算公因子,,默默学习一下。。

题解:设n=p1^(c1)p2^{c2}...pm^{cm},n=p​1^​c​1*​​​​p​2​^c​2​​​​...p​m​^c​m​​​​,则d(n^k)=(k*c1+1)(k*c2+1)...(k*cm+1)d(n​k​​)=(kc​1​​+1)(kc​2​​+1)...(kc​m​​+1)。然后由于l,r的值很大,但是l-r的范围还是可以接受的,所以我们用一个偏移数组

来存l<=n<=r数的d(n)。然后就是求解l~r中质因子的过程了,这里用筛法求。首先我们知道,一个数可以唯一分解为若干个素数幂的乘积,那么我们先筛出sqrt(r)范围内的所有素数,那么(l,r)中所有的非素数都可以用sqrt(r)

中的素数表示(过程有点类似欧拉函数的筛法)。比赛的时候没想到用筛法,一直挂机,难受。,

ac代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=1e6+;
const int mod=;
ll prime[maxn];
int vis[maxn];
ll d[maxn],arr[maxn];
// 比较大的数组放全局
int ret;
void init()
{
memset(vis,,sizeof(vis));
ret=;
for(ll i=;i<maxn;i++)
{
if(!vis[i])
{
prime[++ret]=i;
for(ll j=i*;j<=maxn;j+=i) vis[j]=;
}
}
}
void solve(ll l,ll r,ll k)
{
for(ll i=;i<=ret;i++)
{
ll pos=(l+prime[i]-)/prime[i]*prime[i];// 定位
while(pos<=r)
{
int zz=;//
while(arr[pos-l]%prime[i]==)
{
zz++;
arr[pos-l]/=prime[i];
}
d[pos-l]*=(k*zz+);
d[pos-l]%=mod;
pos+=prime[i];
}
}
ll ans=;
for(ll i=l;i<=r;i++)
{
if(arr[i-l]==) ans=(ans+d[i-l])%mod;
else ans=(ans+d[i-l]*(k+))%mod;//唯一分解定理
}
printf("%lld\n",ans);
}
// 数差在一定范围 就可以用偏移数组
int main()
{
int t;
scanf("%d",&t);
init();
while(t--)
{
ll l,r,k;
scanf("%lld %lld %lld",&l,&r,&k);
for(ll i=l;i<=r;i++)
{
arr[i-l]=i;
d[i-l]=;
}
solve(l,r,k);
}
return ;
}

自己选的路,跪着也要走下去

埃氏筛法,这里也是一个算各个素数的贡献的思想,由于素数是有限的,所以可以可以把问题的规模变小  by-2017-09-17

hdu 6069 Counting divisors 公式+区间筛的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)

    题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...

  2. HDU 6069 Counting Divisors(区间素数筛法)

    题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K ...

  3. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. HDU 6069 Counting Divisors —— 2017 Multi-University Training 4

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  5. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  6. hdu 6069 Counting Divisors 筛法

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  7. HDU 6069 Counting Divisors(唯一分解定理+因子数)

    http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{ ...

  8. HDU 6069 Counting Divisors (素数+筛法)

    题意:给定 l,r,k,让你求,其中 l <= r <= 1e12, r-l <= 1e6, k <= 1e7. 析:首先这个题肯定不能暴力,但是给定的区间较小,可以考虑筛选, ...

  9. HDU 6069 Counting Divisors(2017 Multi-University Training Contest - Team 4 )

    Output For each test case, print a single line containing an integer, denoting the answer.   Sample ...

随机推荐

  1. HTTP_POST请求的数据格式

    HTTP_POST请求的数据格式 在HTTP的请求头中,可以使用Content-type来指定不同格式的请求信息. Content-type的类型 常见的媒体格式类型:     text/html : ...

  2. pwn学习日记Day17 《程序员的自我修养》读书笔记

    静态链接章小结 本章首先学习了静态链接的第一步骤,即目标文件在被链接成最终可执行文件时,输入目标文件中的各段是如何被合并到输出文件中的,链接器如何为它们分配在输出文件中的空间和地址.一旦输入段中的最终 ...

  3. 进程| 线程 | 阻塞 | 阻塞&非阻塞 和 同步&异步

    阻塞&非阻塞 阻塞IO 调用之后一定要等到系统内核完成所有的操作之后才结束,因此它的缺点:CPU等待IO,处理能力得不到充分利用. 非阻塞IO 为了解决阻塞IO带来的一些问题,内核提供了非阻塞 ...

  4. Mac 平台安装MySQL

    Mac 平台安装MySQL   一.下载MySQL MySQL官网上https://dev.mysql.com/downloads/mysql/,下载Community Server版 出现如下界面, ...

  5. kafka和rabbitmq对比

    1.吞吐量kafka吞吐量更高:1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率.2)磁盘顺 ...

  6. linux下如何使rtc设备注册为指定的设备文件/dev/rtc1?

    答: 通过设备树中的aliases节点来指定即可; 如某rtc设备的节点名为rtc@68,那么想让系统为该设备生成指定的设备文件/dev/rtc1,那么就在设备树的根节点中增加aliases节点,示例 ...

  7. vue 自定义 提示框(Toast)组件

    1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ...

  8. 强悍的Python读取大文件的解决方案

    这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...

  9. Linux 远程登陆图形界面

    如果我的解决方案帮助到了你,请随手点亮一颗小红心.如有疑问,可在下方评论区处留言. 利用Xmanager,linux启用XDMCP协议(可直接修改配置文件,也可以采用在Xshell中运行gdmconf ...

  10. java nio 缓冲区读写数据(图形详解)

    Position 您可以回想一下,缓冲区实际上就是美化了的数组.在从通道读取时,您将所读取的数据放到底层的数组中. position 变量跟踪已经写了多少数据.更准确地说,它指定了下一个字节将放到数组 ...