CodeForces 3107 ODDDIV - Odd Numbers of Divisors(数论)
2017-07-19 09:02
453 查看
Description
给出一奇数k,问[L,R]中有多少数其因子数为k
Input
第一行一整数T表示用例组数,每组用例输入三个整数k,L,R(0 < T < 1e5, 1 < k <10000, 0 < L<=R < 1e10)
Output
对于每组用例,输出[L,R]中因子数为k的数的个数
Sample Input
3
3 2 49
9 1 100
5 55 235
Sample Output
4
2
1
Solution
因子数为奇数的数必为完全平方数,因为一个数n只要有一个因子i那么n/i也是其因子,故因子都是成对出现的,除非n是完全平方数,所以问题变成求[L,R]中有多少完全平方数的因子数是k,注意到对一个数n,对其素因子分解后有n=p1^a1 * p2^a2 * … * pk^ak,进而得到n^2的因子数为(2*a1+1) * (2*a2+1) * … * (2*ak+1),所以我们只需要把1e5内所有数素因子分解就可以得到1e10内所有完全平方数的因子数,给每个因子数开个vector记录那些因子数是这个数的数,预处理出来i的因子数cnt[i],然后把i放进属于cnt[i]的vector里,对于每次查询在k的vector里二分查找即可
Code
给出一奇数k,问[L,R]中有多少数其因子数为k
Input
第一行一整数T表示用例组数,每组用例输入三个整数k,L,R(0 < T < 1e5, 1 < k <10000, 0 < L<=R < 1e10)
Output
对于每组用例,输出[L,R]中因子数为k的数的个数
Sample Input
3
3 2 49
9 1 100
5 55 235
Sample Output
4
2
1
Solution
因子数为奇数的数必为完全平方数,因为一个数n只要有一个因子i那么n/i也是其因子,故因子都是成对出现的,除非n是完全平方数,所以问题变成求[L,R]中有多少完全平方数的因子数是k,注意到对一个数n,对其素因子分解后有n=p1^a1 * p2^a2 * … * pk^ak,进而得到n^2的因子数为(2*a1+1) * (2*a2+1) * … * (2*ak+1),所以我们只需要把1e5内所有数素因子分解就可以得到1e10内所有完全平方数的因子数,给每个因子数开个vector记录那些因子数是这个数的数,预处理出来i的因子数cnt[i],然后把i放进属于cnt[i]的vector里,对于每次查询在k的vector里二分查找即可
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f vector<int>v[666]; void init() { int f[111],res; for(int i=1;i<=100000;i++) { res=0; int j=i; for(int k=2;k*k<=j;k++) if(j%k==0) { f[res]=0; while(j%k==0)f[res]++,j/=k; res++; } if(j!=1)f[res++]=1; int temp=1; for(int j=0;j<res;j++) temp=temp*(2*f[j]+1); v[temp/2].push_back(i); } } int main() { init(); int T,k; ll l,r; scanf("%d",&T); while(T--) { scanf("%d%lld%lld",&k,&l,&r); if(k>1323)printf("0\n"); else { l=(int)sqrt(l-0.5),r=(int)sqrt(r+0.5),k/=2; int ans1=upper_bound(v[k].begin(),v[k].end(),r)-v[k].begin()-1; int ans2=upper_bound(v[k].begin(),v[k].end(),l)-v[k].begin()-1; printf("%d\n",ans1-ans2); } } return 0; }
相关文章推荐
- SPOJ ODDDIV - Odd Numbers of Divisors
- Spoj-ODDDIV Odd Numbers of Divisors
- [CodeForces 27E] Number With The Given Amount Of Divisors (数论 + 反素数)
- Codeforces 209 div2 D. Pair of Numbers
- Codeforces 432 Div. 2-D-Arpa and a list of numbers(枚举倍数求GCD)
- Codeforces Beta Round #27 (Codeforces format, Div. 2) E. Number With The Given Amount Of Divisors 反素数
- hdoj 1492 The number of divisors(约数) about Humble Numbers 【数论】【质因子分解 求和】
- HDU 1492 The number of divisors(约数) about Humble Numbers(数论题目要知道定理呀....)
- codeforces 27E - Number With The Given Amount Of Divisors (数论 dfs)
- codeforces 27E E. Number With The Given Amount Of Divisors(dp+数论)
- ACM 数论 hdu 1492 The number of divisors(约数) about Humble Numbers
- [DP] Codeforces 403D #236 (Div. 1) D. Beautiful Pairs of Numbers
- HDU1492-The number of divisors(约数) about Humble Numbers-数论(计数问题)
- HDU 1492 The number of divisors(约数) about Humble Numbers(数学题)
- CF359D:Pair of Numbers(数论)
- Codeforces Div. 2 #258-C. Predict Outcome of the Game
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem F (Codeforces 831F) - 数论 - 暴力
- CodeForces 359 D.Pair of Numbers (二分+ST)
- 【HDU1492】The number of divisors(约数) about Humble Numbers
- Codeforces Codeforces Round #432 (Div. 2 D ) Arpa and a list of numbers