博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数论+DP HDOJ 4345 Permutation
阅读量:7045 次
发布时间:2019-06-28

本文共 1817 字,大约阅读时间需要 6 分钟。

 

题意:一个置换群,经过最少k次置换后还原。问给一个N个元素,在所有的置换群里,有多少个不同的k。

分析:这道题可以转化成:N = Σ ai ,求LCM ( ai )有多少个不同的值。比如N=10时,k可为:1,2,3,2*2,5,2*3,7,2*2*2,3*3,2*5,2*2*3,2*7,3*5,2*2*5,3*7,2*3*5,共16个,这里用到了:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如:  。那么先预处理出1000内的素数,dp[i][j]表示用到了前i个素数,组成和为j,的个数,一个素数可能用到多次。因为1对结果不影响,所以结果是Σ dp[m][i] (m最大的素数<=n,i<=n)

收获:1. 置换群和唯一分解定理 2. DP和数论结合

 

代码:

/************************************************* Author        :Running_Time* Created Time  :2015-8-27 18:11:40* File Name     :F.cpp ************************************************/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1typedef long long ll;const int N = 1e3 + 10;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;int prime[N/2];bool is_prime[N];ll dp[200][N];int seive(void) { int p = 0; memset (is_prime, true, sizeof (is_prime)); for (int i=2; i<=1000; ++i) { if (is_prime[i]) prime[++p] = i; for (int j=1; j<=p && prime[j]*i<=1000; ++j) { is_prime[i*prime[j]] = false; if (i % prime[j] == 0) break; } } return p;}int main(void) { int p = seive (); int n, m = 0; while (scanf ("%d", &n) == 1) { memset (dp, 0, sizeof (dp)); dp[0][0] = 1; for (int i=1; i<=p; ++i) { for (int j=0; j<=n; ++j) dp[i][j] = dp[i-1][j]; int res = prime[i]; if (res <= n) m = i; else break; while (res <= n) { for (int j=0; j+res<=n; ++j) { if (dp[i-1][j]) dp[i][j+res] += dp[i-1][j]; } res *= prime[i]; } } ll ans = 0; for (int i=1; i<=n; ++i) ans += dp[m][i]; printf ("%I64d\n", ans + 1); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/4765685.html

你可能感兴趣的文章
jquery miniui 学习笔记
查看>>
dubbo AdaptiveExtension
查看>>
Scrapy系列教程(1)------命令行工具
查看>>
Using Autorelease Pool Blocks
查看>>
spring-struts-mybatis整合错误集锦
查看>>
Maven 通过maven对项目进行拆分、聚合(重点)
查看>>
TWaver版3D化学元素周期表
查看>>
Java 中最常见的 5 个错误
查看>>
[AWS vs Azure] 云计算里AWS和Azure的探究(2)
查看>>
查看是否安装.NET Framework、.NET Framework的版本号、CLR版本号
查看>>
数据结构基础温故-5.图(下):最短路径
查看>>
调试Release发布版程序的Crash错误(转)
查看>>
深入浅出话VC++(2)——MFC的本质
查看>>
跟我一起学WCF(5)——深入解析服务契约[上篇]
查看>>
Kinect应用开发实战:用最自然的方式与机器对话
查看>>
JavaScript验证手机号码
查看>>
微软免费杀毒软件MSE最新版本释出
查看>>
诊断 Java 代码: 提高 Java 代码的性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换...
查看>>
一次数据库hang住的分析过程
查看>>
ArcGIS使用字体文件制作符号库!
查看>>