cf822D(质因子)

题目链接: http://codeforces.com/problemset/problem/822/D

题意: 输入 t, l, r 求 t0·f(l)?+?t1·f(l?+?1)?+?...?+?tr?-?l·f(r) % (1e9 + 7) , 至于 f(n) 是多少还是直接去看题目描述吧, 好难说清楚;

思路: xjb

很显然将 n 分解成质因子积的形式时比的场数最少, 那么可以用prime[i] 存储 i 的最小素数因子, 然后 n 不断除 prime[n] 即可得到 n 的质因子积的形式;

剩下的按照公式来就好了;

代码:

 1 #include <iostream>
 2 #define ll long long
 3 using namespace std;
 4
 5 const int mode = 1e9 + 7;
 6 const int MAXN = 5e6 + 10;
 7 int prime[MAXN];
 8
 9 void get_prime(void){
10     for(int i = 2; i < MAXN; i++){
11         if(!prime[i]){
12             for(int j = 1; j * i < MAXN; j++){
13                 if(!prime[i * j]) prime[i * j] = i;
14             }
15         }
16     }
17 }
18
19 ll get_f(ll n){
20     ll ans = 0;
21     while(n > 1){
22         ll cnt = prime[n];
23         ans += cnt * (cnt - 1) / 2 * (n / cnt);
24         if(ans >= mode) ans %= mode;
25         n /= cnt;
26     }
27     return ans;
28 }
29
30 int main(void){
31     get_prime();
32     ll t, l, r, ans  = 0, cnt = 1;
33     cin >> t >> l >> r;
34     for(ll i = l; i <= r; i++){
35         ans += cnt * get_f(i);
36         if(ans >= mode) ans %= mode;
37         cnt = cnt * t % mode;
38     }
39     cout << ans << endl;
40     return 0;
41 }

时间: 2024-10-08 18:35:30

cf822D(质因子)的相关文章

最大质因子序列

21:最大质因子序列总时间限制: 1000ms 内存限制: 65536kB描述任意输入两个正整数m, n (1 < m < n <= 5000),依次输出m到n之间每个数的最大质因子(包括m和n:如果某个数本身是质数,则输出这个数自身). 输入一行,包含两个正整数m和n,其间以单个空格间隔.输出一行,每个整数的最大质因子,以逗号间隔.样例输入5 10样例输出5,3,7,2,3,5 题目链接:http://noi.openjudge.cn/ch0113/21/ 1 #include <

分解质因子(个人模版)

分解质因子: 1 memset(prime,0,sizeof(prime)); 2 memset(num,0,sizeof(num)); 3 for(int i=2;i<=5000005;i++) 4 { 5 if(prime[i]==0) 6 { 7 for(int j=i;j<=5000005;j+=i) 8 { 9 int temp=j; 10 while(temp%i==0) 11 { 12 num[j]++; 13 temp/=i; 14 } 15 prime[i]=1; 16 }

Openjudge 1.13-21:最大质因子序列(每日两水)

总时间限制:  1000ms 内存限制:  65536kB 描述 任意输入两个正整数m, n (1 < m < n <= 5000),依次输出m到n之间每个数的最大质因子(包括m和n:如果某个数本身是质数,则输出这个数自身). 输入 一行,包含两个正整数m和n,其间以单个空格间隔. 输出 一行,每个整数的最大质因子,以逗号间隔. 样例输入 5 10 样例输出 5,3,7,2,3,5 还是水题.. 查看 #include <iostream> #include <cstr

找最大质因子问题

题目描述,例如13195的质因子有5,7,13,29,其中29是最大质因子,现在给你一个数600,851,475,143,,让你求它的最大质因子. 这个数记为number,在2-sqrt(number)内先找出质因子然后让number除这些比较小的质因子不断的变小最后剩下的number%i==0的number就是要求的maxnumber(这个number本身是质数的情况要单独讨论下) 以下是AC代码 1 #include<iostream> 2 #include<cstdlib>

(hdu step 2.1.3)Largest prime factor(求一个数的最大质因子的位置)

题目: Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4868 Accepted Submission(s): 1452   Problem Description Everybody knows any number can be combined by the prime number.Now,

UVA10892 - LCM Cardinality(分解质因子)

题目链接 题意:输入正整数n,统计有多少对正整数a <= b,满足lcm(a, b) = n. 思路:分解质因子,然后直接暴力求出对数 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const int MA

HDU4961-Boring Sum(质因子)

点击打开链接 题意:给出n个数的数列a,bi的取值为在1 <= j < i之间如果存在aj % ai == 0,则取最大下标的值赋给bi,如果不存在,则bi = ai:ci的取值为在i < j <= n之间如果存在aj % ai == 0,则取最小下标值赋给bi,如果不存在,则ci = ai.求b1 * c1 + b2 * c2 + ... + bn * cn的和. 思路:如果直接暴力的话一定会超时,所以我们可以开一个vis数组来记录每一个值所对应的最大的下标是多少.即每查找ai,

求一个数的质因子

private static void prime(int i){ int j = 2; while(true){ while(i%j == 0 && i != j){ System.out.println("Prime num " + j); i = i/j; } if(i == j){ System.out.println("Prime num " + j); break; } j++; } } private static void prime

质因子个数

// 质因子个数int num[MAXN]; inline void init(){    num[1] = 0;    for (int i = 2; i < MAXN; ++i)    {        if (!num[i])        {            num[i] = 1;            for (int j = i + i; j < MAXN; j += i)            {                int temp = j;