E. Resistors in Parallel
题意:
图1: 图2 图3:
选择n以内的一个i,使得Si最大,S_i的值就是说i的所有因子作为下标j,对所有r_j(计算方式见图1)进行图2中的运算使得R最小。
思路:对于图2中,因为可以知道R_1、R_2…R_k都是选择的数x的因子,所有分母中的分母可以通分为x,那么分母中的分子就是x的因数之和。 整体是取倒数,所以R=x/x的因数之和 也就是要选择n以内的一个数,使得他比上他的因子和最小。
然后简单打表一下可以发现,选择的数字是从小到大的质数相乘 2、6、30、210… 所以可以把前100个质数打出来,然后计算一下因数之和即可。
计算一个数的因数之和我们用(1+p_1) * (1+p_2) * … * (1+p_n)即可
原理就是对于一个数的每种质因子的个数,可以选择的个数区间为0-cnt_i,那么一个数的因子其实就是对于每种质因子看要选择了多少个数,那么对于该种质因子贡献就是(1+(p_1) ^ 1 + (p_1) ^ 2 +(p_1) ^ 3…+ (p_1) ^ cnt_1) 根据乘法原理很容易的出上式子。 这题因为质因子都只计算了一次,所以cnt_i都是1
大数,这里用的是python,注意除以gcd即可
l = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997] for T in range(int(input())): n = int(input()) sum = 1 sum1 = 1 i = 0 while 1: if sum * l[i] > n: break sum *= l[i] sum1 *= (1 + l[i]) i += 1 for j in range(i): if(sum%l[j]==0 and sum1%l[j]==0): sum//=l[j] sum1//=l[j] print("%d/%d" % (sum,sum1))