题目

Source

http://www.lightoj.com/volume_showproblem.php?problem=1298

Description

A number is Almost-K-Prime if it has exactly K prime numbers (not necessarily distinct) in its prime factorization. For example, 12 = 2 * 2 * 3 is an Almost-3-Prime and 32 = 2 * 2 * 2 * 2 * 2 is an Almost-5-Prime number. A number X is called Almost-K-First-P-Prime if it satisfies the following criterions:

1. X is an Almost-K-Prime and
2. X has all and only the first P (P ≤ K) primes in its prime factorization.

For example, if K=3 and P=2, the numbers 18 = 2 * 3 * 3 and 12 = 2 * 2 * 3 satisfy the above criterions. And 630 = 2 * 3 * 3 * 5 * 7 is an example of Almost-5-First-4-Pime.

For a given K and P, your task is to calculate the summation of Φ(X) for all integers X such that X is an Almost-K-First-P-Prime.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case starts with a line containing two integers K (1 ≤ K ≤ 500) and P (1 ≤ P ≤ K).

Output

For each case, print the case number and the result modulo 1000000007.

Sample Input

3
3 2
5 4
99 45

Sample Output

Case 1: 10
Case 2: 816
Case 3: 49939643

分析

题目大概说,定义,一个数为Almost-K-First-P-Prime当且仅当这个数由K个质因子组成,且这K个质因子包含且仅包含于前P个质数。给定k和p,求Σphi(AkFpP)。

首先要知道欧拉函数这几个性质:

  1. φ(p)=p-1(p是质数)
  2. φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a)
  3. φ(p*a)=p*φ(a)(p是质数且p|a)

然后,可以考虑用DP来解,利用上面的性质去转移。

一开始我这么想的,首先由于k个质因子中那p个是一定要有的,先把它们固定下来,即∏prime[1...p],其phi值为∏(prime[1...p]-1)。然后还剩下k-p个质因子要确定,有p个质因子可以选择,这其实就是完全背包问题了:p种物品体积都为1选了之后价值*prime[i],背包容量k-p,问所有选择方案的价值和。

不过这样会TLE的,数据有10000组,通过可以枚举p把所有情况预处理出来,O(P2K)的时间复杂度,可能会超时,不过已经爆内存了。

事实上还有更直接的预处理方式:

  • dp[i][j]表示Σphi(Almost-i-First-j-Prime)

考虑这么转移:

  • 如果prime[j]只出现一次,那么就是从dp[i-1][j-1](这个状态prime[j]不会出现,出现的是前j-1个质数)通过第i个质因子选择prime[j]转移:dp[i][j]+=dp[i-1][j-1]*(prime[j]-1)
  • 如果prime[j]出现多于一次,那么就是从dp[i-1][j](这个状态prime[j]至少出现一次,再加上一次就大于1次了)转移了:dp[i][j]+=dp[i-1][j]*prime[j]

时间复杂度就是O(PK)

其实这种转移的分析方式觉得挺强的,分成等于1、大于等于1,这两个能分别求出来且互补的子问题。和排队购票那个经典题的转移一样。

下面是那两个算法的代码实现。

代码

O(P2K)

#include<cstdio>
#include<cstring>
using namespace std;int prime[555];bool is_prime(int n){for(long long i=2; i*i<=n; ++i){if(n%i==0) return 0;}return 1;
}long long d[501][501][500];void init(){int n=0;for(int i=2; n!=500; ++i){if(is_prime(i)){prime[++n]=i;}}for(int p=1; p<=500; ++p){d[p][0][0]=1;for(int i=1; i<=p; ++i){d[p][0][0]*=prime[i]-1;d[p][0][0]%=1000000007;}for(int i=1; i<=p; ++i){for(int j=0; j<500; ++j){if(j) d[p][i][j]=d[p][i-1][j]+d[p][i][j-1]*prime[i];else d[p][i][j]=d[p][i-1][j];d[p][i][j]%=1000000007;}}}
}int main(){init();int t,k,p;scanf("%d",&t);for(int cse=1; cse<=t; ++cse){scanf("%d%d",&k,&p);printf("Case %d: %lld\n",cse,d[p][p][k-p]);}return 0;
}

O(PK)

#include<cstdio>
#include<cstring>
using namespace std;int prime[555];bool is_prime(int n){for(long long i=2; i*i<=n; ++i){if(n%i==0) return 0;}return 1;
}long long d[555][555];void init(){int n=0;for(int i=2; n!=500; ++i){if(is_prime(i)){prime[++n]=i;}}d[0][0]=1;for(int i=1; i<=500; ++i){for(int j=1; j<=i; ++j){d[i][j]+=d[i-1][j-1]*(prime[j]-1);if(i-1>=j) d[i][j]+=d[i-1][j]*prime[j];d[i][j]%=1000000007;}}
}int main(){init();int t,k,p;scanf("%d",&t);for(int cse=1; cse<=t; ++cse){scanf("%d%d",&k,&p);printf("Case %d: %lld\n",cse,d[k][p]);}return 0;
}

转载于:https://www.cnblogs.com/WABoss/p/5767332.html

LightOJ1298 One Theorem, One Year(DP + 欧拉函数性质)相关推荐

  1. 欧拉函数性质证明 : n所有约数的欧拉函数和等于n

    性质:对于正整数n ∑d|nϕ(d)=n \sum_{d|n}\phi(d) = n 证明过程 (1)如果 n = 1 ϕ(n)=1=n \phi(n) = 1 = n 满足 (2)如果n是质数 ϕ( ...

  2. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  3. 数学--数论-数论函数-欧拉函数

    **欧拉函数定义 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.例如euler(8)=4,因为1,3,5,7均和8互质. Euler函数表达通式: 其中p1,p2--pn为x的所有素因数 ...

  4. 数论 —— 欧拉函数

    [定义] 对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作: 例如:,因为 1.3.5.7 均与 8 互质. [性质] 1)若 n 为一素数 p,则: 2)若 n 为一素数 p ...

  5. 详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数

    欧拉函数 欢迎各位读者指出不足,谢谢~ 首先我们要知道欧拉函数是个什么东东? 废话不多说~欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 欧拉函数的通式: ...

  6. 数论讨伐!欧拉函数!

    [欧拉函数] 任务开始. 什么是欧拉函数?我们又怎么求呢??? 此次任务的主要怪物:欧拉函数 (1)欧拉函数定义 欧拉函数嘛,当然是我们著名的莱昂哈德·欧拉发明的啦~那么他是怎么定义介个函数滴? 咳咳 ...

  7. XTU OJ 1355 Euler‘s Totient Function(欧拉函数)

    XTU OJ 1355 Euler's Totient Function(欧拉函数) 题目描述 对于整数n,定义ϕ(n)ϕ(n)ϕ(n)为小于或等于n,并与n互质的整数的个数,比如6,比它小的和它互质 ...

  8. 数论之互质与欧拉函数

    文章开始前先给大家安利我学长以前写的数论的blog:aliayc 文章目录 互质 欧拉函数 质因数分解求欧拉函数 筛法求欧拉函数 性质 积性函数 定义 性质 题目 互质 定义 ∀ a , b ∈ N ...

  9. jzoj1161-机器人M号【欧拉函数,dp】

    正题 大意 因为题目比较gou,所以就直接放题目了 机器人1号可以制造其他的机器人. 第2秒,机器人1号造出了第一个机器人--机器人2号. 第3秒,机器人1号造出了另一个机器人--机器人3号. 之后每 ...

最新文章

  1. 我,是真是一个培训班出来的程序员
  2. beyond compare比较工具设置
  3. js判断是否是ie浏览器且给出ie版本
  4. STM32 进阶教程 17 - ADC注入通道
  5. Java-Java反射
  6. html5语义化标签marquee,高效书写HTML5,快速提升你的编码效率!
  7. oracle11g imp性能,怎么最快地把本机的oracle11g数据导入xe
  8. rman学习笔记部分
  9. 【算法】学习笔记(5):快速排序
  10. 一道经典面试题 你是是否理解 if()没有大括号与有大括号区别吗?
  11. 文件系统 文件时间记录在哪里_计算机系统基础:文件管理相关知识笔记
  12. GoF 的 23 种设计模式的分类和功能
  13. python怎么加图片_python如何增加背景图片
  14. 逆水寒7.25服务器维护,逆水寒7月4日更新维护公告 角色交易功能上线
  15. mysql查询周数_MySQL如何获取一个指定日期所对应本年度的周数(WEEK函数)呢?
  16. 解决windows10环境下conda创建环境出现 No writeable pkgs directories configured
  17. 影视动画设计有些SCI期刊推荐? - 易智编译EaseEditing
  18. Android Instant Apps
  19. 对mtk平台的一些认识
  20. 178页7万字智慧乡村大数据平台建设项目解决方案2022

热门文章

  1. 第三十五讲:tapestry Ajax zone组件无黄色闪烁的背景
  2. 中信国健临床通讯  2011年3月期 目 录
  3. ASP.NETmvc常用JQUERY收藏【jquery.form.js结合jquery.validate.js】
  4. OC中的几种延迟执行方式
  5. linux专用的opencv下载链接(持续更新)
  6. 递归方式-全排列生成算法
  7. ubuntu20.04运行《大航海家2》
  8. org.apache.hadoop.hive.metastore.api.InvalidObjectException: Role public already exists.
  9. Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
  10. 大话数据结构 17:图的深度优先遍历和广度优先遍历