Problem Description
source:https://uva.onlinejudge.org/external/118/11876.uva
Consider an integer sequence N where,
N0 = 1
Ni = Ni−1 + NOD(Ni−1) for i > 0
Here, NOD(x) = number of divisors of x.
So the first few terms of this sequence are 1 2 4 7 9 12 18 ...
Given two integers A and B, find out the number of integers in the above sequence that lies within the range [A, B].
Input
The first line of input is an integer T (T < 100000), that indicates the number of test cases. Each case contains two integers, A followed by B (1 ≤ A ≤ B ≤ 1000000).
Output
For each case, output the case number first followed by the required result.
Sample Input
3
1 18
1 100
3000 4000
Sample Output
Case 1: 7
Case 2: 20
Case 3: 87
source:https://uva.onlinejudge.org/external/118/11876.uva
Consider an integer sequence N where,
N0 = 1
Ni = Ni−1 + NOD(Ni−1) for i > 0
Here, NOD(x) = number of divisors of x.
So the first few terms of this sequence are 1 2 4 7 9 12 18 ...
Given two integers A and B, find out the number of integers in the above sequence that lies within the range [A, B].
Input
The first line of input is an integer T (T < 100000), that indicates the number of test cases. Each case contains two integers, A followed by B (1 ≤ A ≤ B ≤ 1000000).
Output
For each case, output the case number first followed by the required result.
Sample Input
3
1 18
1 100
3000 4000
Sample Output
Case 1: 7
Case 2: 20
Case 3: 87
Solution:
#include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <deque> #include <fstream> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #include<stdio.h> #define max 1000000 using namespace std; void generate(); void Nodgen(); long int dividor[max],Nodvalue[max],posi; void generate() { long int i, j, k; for(i=0;i<=max;i++) dividor[i]=1; for(i=2;i<=max;i++) { dividor[i]+=1; for(j=i+i;j<=max;j=j+i) dividor[j]+=1; } } void Nodgen() { long int i,j; Nodvalue[0]=1; for(i=1;i<=max;i++) { Nodvalue[i]=Nodvalue[i-1]+dividor[Nodvalue[i-1]]; if((Nodvalue[i-1]+dividor[i-1])>=1000000) break; posi=i; } } int main() { long int t, a, b, i, j,count1,count2,s,temp,sum,value,low,mid,high,set; generate(); Nodgen(); while(scanf("%ld",&t)==1) { for(i=1;i<=t;i++) { scanf("%ld%ld",&a,&b); if(a!=1) { set=18; low=0; high=posi; while(set--) { mid=(low+high)/2; if(Nodvalue[mid]>a) high=mid; else low=mid; } if(Nodvalue[high-1]==a) count1=high-1; else count1=high; } set=18; low=0; high=posi; while(set--) { mid=(low+high)/2; if(Nodvalue[mid]>b) high=mid; else low=mid; } count2=high; if(a==1) value=count2; else value=count2-count1; printf("Case %ld: %ld\n",i,value); } } return 0; }
No comments:
Post a Comment
Write your comment - Share Knowledge and Experience