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 ...
随机推荐
- Linux设备驱动程序 之 get_free_page
get_free_page 如果模块需要分配大块的内存,使用面向页的分配会有很多优点: 分配页面可使用下面的函数: unsigned long get_zeroed_page(gfp_t gfp_ma ...
- 运维自动化之ansible
Ansible简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用.配置.编排task(持续交付.无宕机 ...
- java Annotation 注解的使用
源码地址:https://github.com/yylxy/JavaAnnotationTest.git java Annotation 注解的使用 ,代码中有详细的注释.是用AndroidStudi ...
- windows下xampp安装rabbitmq的PHP扩展AMQP
windows上使用的php扩展为dll文件,首先去下载dll文件,可以到 https://pecl.php.net/package/amqp 选择对应的版本下载 下载压缩包解压后,把里面的两个dll ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_7.RabbitMQ研究-工作模式-工作队列模式
RabbitMQ有以下几种工作模式 : 1.Work queues 2.Publish/Subscribe 3.Routing 4.Topics 5.Header 6.RPC 1.Work queue ...
- 动手生成 Delphi xe DBTreeview 三级行政图树 省市县
表结构及记录 object tarea: TFDQuery Connection = FDConnection1 SQL.Strings = ( 'select *' ...
- mysql允许远程机器连接
mysql> use mysql; Reading table information for completion of table and column names You can turn ...
- Spring Security(3):配置与自动配置的介绍及源码分析
基于注解的配置(Java Configuration)从Spring Security 3.2开始就已经支持,本篇基于Spring boot注解的配置进行讲解,如果需要基于XML配置(Security ...
- python进阶-mock接口
setting.py MYSQL_HOST='192.168.127.139' PASSWORD=' PORT=3306 USER='root' DB='stu' tools.py import py ...
- 在win10上使用premake工具和vs2017编译运行Box2D源码和Testbed
1.从github上下载Box2D源码的zip包 2.解压缩zip包 3.从premake网站下载premake5工具,解压后得到premake5.exe 4.将premake5.exe拷贝到Box2 ...