hdu 6069 Counting divisors 公式+区间筛
比赛的时候把公式扣出来了,,但是没有想到用筛法算公因子,,默默学习一下。。
题解:设n=p1^(c1)p2^{c2}...pm^{cm},n=p1^c1*p2^c2...pm^cm,则d(n^k)=(k*c1+1)(k*c2+1)...(k*cm+1)d(nk)=(kc1+1)(kc2+1)...(kcm+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 公式+区间筛的更多相关文章
- 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)
题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...
- HDU 6069 Counting Divisors(区间素数筛法)
题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 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 ...
- hdu 6069 Counting Divisors(求因子的个数)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors 筛法
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- HDU 6069 Counting Divisors(唯一分解定理+因子数)
http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{ ...
- HDU 6069 Counting Divisors (素数+筛法)
题意:给定 l,r,k,让你求,其中 l <= r <= 1e12, r-l <= 1e6, k <= 1e7. 析:首先这个题肯定不能暴力,但是给定的区间较小,可以考虑筛选, ...
- 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 ...
随机推荐
- Flutter移动电商实战 --(28)列表页_商品列表后台接口调试
主要调试商品列表页的接口 这个接口是最难的因为有大类.小类还有上拉加载 先配置接口 config/service_url.dart //const serviceUrl='http://test.ba ...
- python操作MySQL数据库的三个模块
python使用MySQL主要有两个模块,pymysql(MySQLdb)和SQLAchemy. pymysql(MySQLdb)为原生模块,直接执行sql语句,其中pymysql模块支持python ...
- 【English】What is a Java StringWriter, and when should I use it?(转帖)
转帖地址:http://www.it1352.com/989366.html Question: What is a Java StringWriter, and when should I use ...
- P2047 [NOI2007]社交网络(洛谷)
题目描述 在社交网络 ( Social Network ) 的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题:在一个社交圈子里有 nn 个人,人与人之间有不同程度的关系.我们将这 ...
- Objective-C中的一些方法命名“潜规则”
在基于Apple Xcode的Objective-C中,有一些方法命名潜规则,比如就property而言,假定你定义了如下property: @interface MyObject @property ...
- iOS Xib布局某些控件显示或隐藏<约束的修改>
对于这个问题使用Masonry是很好解决的. 注意:绿色的是label2,当indexpath.section % 2 == 0时,label2不存在. 关键代码如下: if (indexPath.s ...
- 15-1 shell脚本进阶
shell脚本进阶 循环 循环执行 将某代码段重复运行多次 重复运行多少次 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for, while, until for循环 for VAR i ...
- python列表删除--remove(),del,pop()
remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...
- centos7安装过程中的安装源设置
centos7的安装源设置:http://mirrors.aliyun.com/centos/7/os/x86_64/
- Go语言中使用切片(slice)实现一个Vector容器
Go语言中的切片(slice)和一些内置函数能实现其他语言容器类Array.Vector的功能,但是Go内置语言包container里只提供了list.heap.ring三种容器,缺少vector容器 ...