题意:给你almost-K-First-P-Prime, 如果一个数xk个质因子,且这k个质因子包含且仅包含前p个质数满足条件。 让你求Σφ(x)

思路:首先我们这p个因子一定要有,也就是剩下k-p个因子是什么了,剩下的因子每个都可以取前p个质数中的任意一个。想到这就有一种背包的感觉,然后在不知道状态转移方程的情况下,我们知道状态转移方程中的选还是不选怎么更新,就要用到欧拉函数更新了:

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

然后我就想到这。。。。开始搜索题解,对我来说太玄学了,看别人也没什么过渡,我是想不到。

dp[i][j]直接存的是答案,当一个质数没出现过,用到性质2,dp[i][j] = dp[i-1][j-1] * (prime[j] - 1) , 一个质数出现过可以用性质3,dp[i][j] += dp[i-1][j] * prime[j]

#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
using namespace std;
const int N = 4000;
const ll mod = 1000000007;
bool vis[N];
ll prime[N], dp[505][505];
void get_prime(){
int pos = 0; vis[1] = 1;
for(ll i = 2; i <= 3600; i++){
if(!vis[i]) prime[++pos] = i;
for(ll j = 1; j <= pos && prime[j]*i <= 3600; j++){
vis[i*prime[j]] = 1;
if(i%prime[j] == 0) break;
}
}
} void init(){
dp[0][0] = 1;
for(int i = 1; i <= 500; i++){
for(int j = 1; j <= i; j++){
dp[i][j] += dp[i-1][j-1] * (prime[j] - 1) % mod; //这个质数第一次被选
if(i-1 >= j) dp[i][j] = (dp[i][j]+dp[i-1][j]*prime[j])%mod; //这个质数之前选过
}
}
} int main(){
get_prime();
init();
int T, cas = 0; cin >> T;
while(T--){
int k, p;
cin >> k >> p;
printf("Case %d: %lld\n", ++cas, dp[k][p]);
}
return 0;
}

LightOJ1298 One Theorem, One Year (欧拉函数dp)的更多相关文章

  1. LightOJ1298 One Theorem, One Year(DP + 欧拉函数性质)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1298 Description A number is Almost- ...

  2. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  3. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  4. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  5. COGS2531. [HZOI 2016]函数的美 打表+欧拉函数

    题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...

  6. poj2478 Farey Sequence (欧拉函数)

    Farey Sequence 题意:给定一个数n,求在[1,n]这个范围内两两互质的数的个数.(转化为给定一个数n,比n小且与n互质的数的个数) 知识点: 欧拉函数: 普通求法: int Euler( ...

  7. 51Nod-1136 欧拉函数

    51Nod: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136 1136 欧拉函数 基准时间限制:1 秒 空间限制: ...

  8. 欧拉函数 - HDU1286

    欧拉函数的作用: 有[1,2.....n]这样一个集合,f(n)=这个集合中与n互质的元素的个数.欧拉函数描述了一些列与这个f(n)有关的一些性质,如下: 1.令p为一个素数,n = p ^ k,则 ...

  9. FZU 1759 欧拉函数 降幂公式

    Description   Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000 ...

  10. hdu 3307 Description has only two Sentences (欧拉函数+快速幂)

    Description has only two SentencesTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

随机推荐

  1. 实验: spring-boot 整合 fluent-mybatis 实验过程!!!!

    1.参考: 简单整合,会报错误 https://segmentfault.com/a/1190000040467885?utm_source=sf-similar-article 利用maven编译, ...

  2. 删除没有刀路的刀具.txt

      1 UF_initialize(); 2 std::vector<tag_t>tool_tag; 3 std::vector<tag_t>del_tag; 4 tag_t ...

  3. SpringBoot项目启动

    SpringBoot项目与其他项目启动方式有些不同. 查看是否是SpringBoot项目,可以查看在项目的pom.xml中是否有引入SpringBoot: 上图中就是对应的spring-boot.若有 ...

  4. Java基础学习:1、Java基础知识

    1.使用最为广泛的Java版本: Java8.Java11 原因:这两个是长期支持版本,扩展支持到2030以及2026年. 2.Java特性 : 面向对象oop.跨平台(class可以在Windows ...

  5. CSR,SSR,PreRender原理解密

    CSR.SSR.Prerender 原理全解密   做前端的同学们肯定或多或少听说过CSR,SSR,Prerender这些名词,但是大多肯定只是停留在听说过,了解过,略懂一点,但是,你真的理解这些技术 ...

  6. 211808543 钟志凌 https://home.cnblogs.com/u/211808543zhongzhiling/ https://github.com/wayne9

    211808543  钟志凌     https://home.cnblogs.com/u/211808543zhongzhiling/   https://github.com/wayne9

  7. 零知识证明(Zero-Knowledge Proof)

    零知识证明(Zero Knowledge Proof)指的是,证明的人可以向验证的人,在不透露任何有用信息的情况下,使得验证者相信该结论是对的. 三种零知识证明技术:zk-SNARKs, Zk-STA ...

  8. Optional类与使用==判断null有什么区别?使用Optional类有什么优势?

    1.使用object==null的例子 2.null带来的问题 3.其他语言中null的处理(替代) 4.Java8的Optional类 4.1 这样做有什么好处呢? 4.2 引入Optional类的 ...

  9. Ribbon负载均衡的实现流程简要分析

    SpringCloud中使用Netflix方案做分布式时,只需要在RestTemplate的bean定义上加一个注解@LoadBalanced,无需做其它任何操作就可以开启负载均衡,怎么做到的呢? 不 ...

  10. python 如何以逗号为分隔符输出数组

    l = [1,2,3,4] print(" ".join(str(i) for i in l)) #输出结果为:1 2 3 4(注意,此时4后面没有空格啦) #以逗号为分隔符 l ...