zoukankan      html  css  js  c++  java
  • BZOJ1025 [SCOI2009]游戏 【置换群 + 背包dp】

    题目链接

    BZOJ1025

    题解

    题意就是问一个(1....n)的排列在同一个置换不断重复下回到(1...n)可能需要的次数的个数
    和置换群也没太大关系
    我们只需知道同一个置换不断重复,实际上就是每个循环节的元素不断在循环节上旋转,所需次数就是所有循环节长度的(lcm)
    这一点很显然

    而循环节数量是任意的,长度也可以是任意的,但总和一定是(n)
    问题就转化为了有多少个数(x)能为总和为(n)的一些数的(lcm)
    如果令(x = prodlimits_{i = 1} p_i^{k_i})
    (sumlimits_{i = 1} p_i^{k_i} le n),那么(x)显然是可以被凑出来的
    我们只需令每一个(p_i^{k_i})作为一个数,再补上一些(1)使得它们总和为(n),那么它们就是一个合法的(lcm)(x)的方案

    问题就转化为了用(le n)的一些质数(p_i^{k_i})凑出(le n)的数的方案数
    显然就是一个分组背包问题

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<map>
    #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define mp(a,b) make_pair<int,int>(a,b)
    #define cls(s) memset(s,0,sizeof(s))
    #define cp pair<int,int>
    #define LL long long int
    using namespace std;
    const int maxn = 1005,maxm = 100005,INF = 1000000000;
    inline int read(){
    	int out = 0,flag = 1; char c = getchar();
    	while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
    	while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
    	return out * flag;
    }
    LL f[maxn],ans;
    int n,p[maxn],pi,isn[maxn];
    void init(){
    	for (int i = 2; i <= n; i++){
    		if (!isn[i]) p[++pi] = i;
    		for (int j = 1; j <= pi && i * p[j] <= n; j++){
    			isn[i * p[j]] = true;
    			if (i % p[j] == 0) break;
    		}
    	}
    }
    int main(){
    	n = read();
    	init();
    	f[0] = 1;
    	for (int i = 1; i <= pi; i++){
    		for (int j = n; j >= 0; j--){
    			for (int k = p[i]; k <= j; k *= p[i])
    				f[j] += f[j - k];
    		}
    	}
    	for (int i = 0; i <= n; i++) ans += f[i];
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    一起来学Java注解(Annotation)
    Intellij IDEA在maven项目中添加外部Jar包运行
    Java反射Reflect的使用详解
    Java泛型使用的简单介绍
    聊一聊Java的枚举enum
    Java集合 HashSet的原理及常用方法
    对比分析HashMap、LinkedHashMap、TreeMap
    TreeMap原理实现及常用方法
    关于红黑树(R-B tree)原理,看这篇如何
    百度地图-中国地图
  • 原文地址:https://www.cnblogs.com/Mychael/p/9026553.html
Copyright © 2011-2022 走看看