给定一个由Q 个查询组成的数组arr[][] ,其中每行由两个数字L和R 组成,表示范围[L, R] ;任务是找到位于 [L, R] 范围内的所有数字的真因数的乘积之和。
注意:由于答案可能很大,因此对每个查询执行 % 和 1000000007。
例子:
Input: Q = 2, arr[] = { { 4, 6 }, { 8, 10 } }
Output: 9 21
Explanation:
Query 1: From 4 to 6
Product of proper divisors of 4 = 1 * 2 = 2
Product of proper divisors of 5 = 1
Product of proper divisors of 6 = 1 * 2 * 3 = 6
Sum of product of proper divisors from 4 to 6 = 2 + 1 + 6 = 9
Query 2: From 8 to 10
Product of proper divisors of 8 = 1 * 2 * 4 = 8
Product of proper divisors of 9 = 1 * 3 = 3
Product of proper divisors of 10 = 1 * 2 * 5 = 10
Sum of product of proper divisors from 8 to 10 = 8 + 3 + 10 = 21
Input: Q = 2, arr[] = { { 10, 20 }, { 12, 16 } }
Output: 975 238
方法:由于可以有多个查询,并且为每个查询查找除数和乘积是不可行的,因此想法是使用对 Eratosthenes 筛选的修改,预先计算每个元素及其适当除数的乘积并将其存储在数组中。
一旦所有数字的真除数的乘积存储在一个数组中,这个想法就是使用前缀和数组的概念。直到该特定索引的适当除数的乘积之和被预先计算并存储在数组pref[] 中,以便可以在恒定时间内回答每个查询。
对于每个查询,可以找到范围[L, R]的所有真除数的乘积之和,如下所示:
sum = pref[R] - pref[L - 1]
下面是上述方法的实现:
CPP
// C++ implementation to find the sum
// of the product of proper divisors of
// all the numbers lying in the range [L, R]
#include
#define ll long long int
#define mod 1000000007
using namespace std;
// Vector to store the product
// of the proper divisors of a number
vector ans(100002, 1);
// Variable to store the prefix
// sum of the product array
long long pref[100002];
// Function to precompute the product
// of proper divisors of a number at
// it's corresponding index
void preCompute()
{
// Modificatino of sieve to store the
// product of the proper divisors
for (int i = 2; i <= 100000 / 2; i++) {
for (int j = 2 * i; j <= 100000; j += i) {
// Multiplying the existing value
// with i because i is the
// proper divisor of ans[j]
ans[j] = (ans[j] * i) % mod;
}
}
// Loop to store the prefix sum of the
// previously computed product array
for (int i = 1; i < 100002; ++i) {
// Computing the prefix sum
pref[i] = pref[i - 1]
+ ans[i];
pref[i] %= mod;
}
}
// Function to print the sum
// for each query
void printSum(int L, int R)
{
cout << pref[R] - pref[L - 1]
<< " ";
}
// Function to print te sum of product
// of proper divisors of a number in
// [L, R]
void printSumProper(int arr[][2], int Q)
{
// Calling the function that
// pre computes
// the sum of product
// of proper divisors
preCompute();
// Iterate over all Queries
// to print the sum
for (int i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
}
// Driver code
int main()
{
int Q = 2;
int arr[][2] = { { 10, 20 },
{ 12, 16 } };
printSumProper(arr, Q);
return 0;
}
Java
// Java implementation to find the sum
// of the product of proper divisors of
// all the numbers lying in the range [L, R]
import java.util.*;
class GFG{
static int mod = 1000000007;
// Vector to store the product
// of the proper divisors of a number
static int []ans = new int[100002];
// Variable to store the prefix
// sum of the product array
static int []pref = new int[100002];
// Function to precompute the product
// of proper divisors of a number at
// it's corresponding index
static void preCompute()
{
// Modificatino of sieve to store the
// product of the proper divisors
Arrays.fill(ans, 1);
for (int i = 2; i <= 100000 / 2; i++) {
for (int j = 2 * i; j <= 100000; j += i) {
// Multiplying the existing value
// with i because i is the
// proper divisor of ans[j]
ans[j] = (ans[j] * i) % mod;
}
}
// Loop to store the prefix sum of the
// previously computed product array
for (int i = 1; i < 100002; ++i) {
// Computing the prefix sum
pref[i] = pref[i - 1]
+ ans[i];
pref[i] %= mod;
}
}
// Function to print the sum
// for each query
static void printSum(int L, int R)
{
System.out.print(pref[R] - pref[L - 1]+" ");
}
// Function to print te sum of product
// of proper divisors of a number in
// [L, R]
static void printSumProper(int [][]arr, int Q)
{
// Calling the function that
// pre computes
// the sum of product
// of proper divisors
preCompute();
// Iterate over all Queries
// to print the sum
for (int i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
}
// Driver code
public static void main(String args[])
{
int Q = 2;
int[][] arr = {{10, 20 },
{ 12, 16 } };
printSumProper(arr, Q);
}
}
// This code is contributed by Surendra_Gangwar
Python3
# Python3 implementation to find the sum
# of the product of proper divisors of
# all the numbers lying in the range [L, R]
mod = 1000000007
# Vector to store the product
# of the proper divisors of a number
ans = [1]*(100002)
# Variable to store the prefix
# sum of the product array
pref = [0]*100002
# Function to precompute the product
# of proper divisors of a number at
# it's corresponding index
def preCompute():
# Modificatino of sieve to store the
# product of the proper divisors
for i in range(2,100000//2+1):
for j in range(2*i,100000+1,i):
# Multiplying the existing value
# with i because i is the
# proper divisor of ans[j]
ans[j] = (ans[j] * i) % mod
# Loop to store the prefix sum of the
# previously computed product array
for i in range(1,100002):
# Computing the prefix sum
pref[i] = pref[i - 1]+ ans[i]
pref[i] %= mod
# Function to prthe sum
# for each query
def printSum(L, R):
print(pref[R] - pref[L - 1],end=" ")
# Function to prte sum of product
# of proper divisors of a number in
# [L, R]
def printSumProper(arr, Q):
# Calling the function that
# pre computes
# the sum of product
# of proper divisors
preCompute()
# Iterate over all Queries
# to prthe sum
for i in range(Q):
printSum(arr[i][0], arr[i][1])
# Driver code
if __name__ == '__main__':
Q = 2
arr= [ [ 10, 20 ],
[ 12, 16 ] ]
printSumProper(arr, Q)
# This code is contributed by mohit kumar 29
975 238
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live