P3226 [HNOI2012]集合选数

简要题意

给你一个 \(n\) 个元素的集合,它由前 \(n\) 个正整数构成。你需要求出它有多少个非空子集,满足若 \(x\) 在这个子集中, \(2x,3x\) 不能在子集中。由于答案可能很大,你只需要对 \(10^9+1\) 取模即可。

\(1 \leq n \leq 10^5\)

思路

这道题的构造思想非常清奇。我们可以构造一个矩阵:

\[A=\begin{bmatrix} 1 & 2 & 4 & 8 & \cdots\\ 3 & 6 & 12 & 24 & \cdots\\ 9 & 18 & 36 & 72 & \cdots\\ 27 & 54 & 108 & 216 & \cdots\\ 81 & 162 & 324 & 648 & \cdots \\ \cdots & \cdots & \cdots & \cdots & \cdots \end{bmatrix} \]

具体来说:

\[A_{i,j}=\begin{cases} & 1 & i=1,j=1\\ & 3\cdot f_{i-1,j} & i\neq 1,j=1\\ & 2\cdot f_{i,j-1} & \text{otherwise} \end{cases} \]

这样子我们就将原问题转化成了给出一个矩阵,如果你选择 \((i,j)\),就不能选择 \((i-1,j)\)\((i,j-1)\),求方案数。这个问题可以使用状压 DP 解决。

我们设 \(f_{i,S}\) 为考虑到第 \(i\) 行,这一行选择 \(S\) 中的元素的方案数。不难发现:

\[f_{i,S}=\begin{cases} & \operatorname{valid}(S) & i=1 \\ & \sum\limits_{T\cup S=\emptyset,\operatorname{valid}(T)}{f_{i-1,T}} & \text{otherwise} \end{cases} \]

其中 \(\operatorname{valid}(S)\) 是指选择该行中 \(S\) 中的元素是否合法,也就是两两是否相邻。用状态压缩的话可以简单地这样实现:

\[\operatorname{valid}(S)=S\&(S>>1)?0:1 \]

当然左移也可以。其实原理就是将原本一样的位错开,相邻的进行与运算。

最后注意这个表不是所有元素都会覆盖到(具体来说,只会覆盖到 \(\forall i,j\in \mathbb{N},2^{i}3^{j}\))。所以我们如果遇到了一个没有被之前覆盖到的元素,我们需要将它设为 \(f_{1,1}\) 重新生成矩阵 \(A\),并重新 DP,最后按照乘法原理(因为这些都可以同时选)将结果累乘。

然后这道题就做完了。最后提醒大家一句,位运算优先级比较低,建议大家勤添括号。

代码

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define valid(x) (x&(x>>1)?0:1)
using namespace std;

const int mod = 1e9+1;
int M(const int x){return (x%mod+mod)%mod;}
const int N = 1e5+5;

int n,vis[N],a[25][25],col[N],f[25][1000005],final,ans=1;

inline void init(int x){
    for(int i=1;i<=11;i++){
        if(i==1) a[i][1]=x;
        else a[i][1]=a[i-1][1]*3;
        if(a[i][1]>n) break;
        vis[a[i][1]]=1;col[i]=1;final=i;
        for(int j=2;j<=18;j++){
            a[i][j]=a[i][j-1]<<1;
            if(a[i][j]>n) break;
            col[i]=j;vis[a[i][j]]=1;
        }
    }
}

inline int dp(int x){
    for(int i=0;i<(1<<col[1]);i++){
        f[1][i]=valid(i);
    }
    for(int i=2;i<=final;i++){
        for(int j=0;j<(1<<col[i]);j++){
            if(!valid(j)) continue;
            f[i][j]=0;
            for(int k=0;k<(1<<col[i-1]);k++){
                if(valid(k) && ((k&j) == 0)) f[i][j]=M(f[i][j]+f[i-1][k]);
            }
        }
    }
    int ret=0;
    for(int i=0;i<(1<<col[final]);i++) ret=M(ret+f[final][i]);
    return ret;
}

signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        if(vis[i]) continue;
        init(i);ans=M(ans*dp(i));
    }
    cout<<ans;
    return 0;
}
如果文章有问题,静待斧正,建议向我(@xiezheyuan)发送洛谷私信并指出博文地址 http://www.cnblogs.com/zheyuanxie/p/p3226.html !
本文转载于网络 如有侵权请联系删除

相关文章

  • 管理者不做老好人

    ps:一个闽南人对职场管理“瓯北公”(胡乱讲),通过某个职场案例,来分享个人见解,让你了解职场的常规操作,很感谢管理学堂的场景案例。 操作难度:★★★☆ 案例: 主管王宏最近遇到棘手的事情,他的下属小明童鞋上班经常迟到,做事也不认真,经常出现不该出现的错误。开始时王宏常给他暗示,希望他能够改正,但一直没有太大改善,那些显而易见的错误仍然经常出现,这样的状况让王宏非常苦恼,他也向经理反映了这个情况,经理给他的建议是:你应该找他认真谈谈,也许要给他严厉的批评,实在不行了,你就换个人吧。王宏按照经理的建议找他谈话。但真正到了谈话的时候,王宏绕来绕去就是无法说出严厉批评的话,他不愿意“伤害人”,更重要的原因是他不习惯当“恶人”。 时间久了,大家对小明的情况就习以为常,视而不见了,而小明同学的工作就需要王宏自己花更多的时间关注和跟进,让他做了越来越多本该是下属做的事情。这也导致整个团队的效率下降,影响工作进程。 作为管理者,尤其是从专业岗走向管理的童鞋来说,习惯于避免与下级的直接冲突。 本期话题:如何指出员工的错误,批评员工的不合理行为(或者技巧),甚至在对方不改变的情况下将其辞退? 本期案

  • pfx证书获取私钥「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。publicclassKeyUtil{ publicKeyUtil(){ } publicstaticPrivateKeygetPrivateKeyFromPFX(InputStreaminputStream,StringpfxFilePwd)throwsPKIException{ PKCS12pkcs12=newPKCS12(); pkcs12.load(inputStream); pkcs12.decrypt(pfxFilePwd.toCharArray()); returnpkcs12.getPrivateKey(); } publicstaticPrivateKeygetPrivateKeyFromPFX(StringpfxFilePath,StringpfxFilePwd)throwsPKIException{ PKCS12pkcs12=newPKCS12(); pkcs12.load(pfxFilePath); pkcs12.decrypt(pfxFilePwd.toCharArray()); returnpkcs12.getPr

  • 招标丨中国铁塔江苏分公司2022年边缘计算网关采购

    项目名称:中国铁塔股份有限公司江苏省分公司2022年边缘计算网关采购项目招标单位:中国铁塔股份有限公司江苏省分公司、铁塔智联技术有限公司江苏省分公司预算:354.4万招标截止:5月24日9:30供货地点:江苏开标地点:比德电子采购平台(https://www.bdebid.com/)采购内容:采购300台边缘计算网关及安装调试维护服务,详见技术规范书。 项目名称:中国移动浙江公司融合边缘云一期二阶段建设项目之技术栈采购项目招标单位:中国移动通信集团浙江有限公司招标截止:5月17日采购内容:融合边缘云一期二阶段建设项目技术栈5640vCPU。中标人数量、中标份额及合同签署:中标4家,中标份额分别为35%、30%、20%、15%;各中标人按中标单价*中标数量为上限签订框架合同。最高限价:本项目以单价设置最高限价,不含税最高限价为1500元/vCPU。投标人投标报价高于最高投标限价的,其投标将被否决。招投标网站:中国移动电子采购与招标投标系统(http://b2b.10086.cn)项目名称:新型计量边缘计算终端辅助生产加工框架采购(二次招标)招标单位:南方电网电力科技股份有限公司预算:80

  • 说说Python中贪婪和非贪婪匹配?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的。 废话不多说,开始今天的题目:问:说说Python中贪婪和非贪婪匹配?答:Python中默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;而非贪婪匹配:与贪婪匹配相反,非贪婪匹配在匹配字符串时总是尝试匹配尽可能少的字符。只需要在量词"*","?","+","{m,n}"后面直接加上一个问号”?”,就可以使贪婪变成非贪婪。python的正则表达式中的量词符号描述*匹配零次或多次+匹配一次或多次?匹配一次或零次{m}重复m次{m,n}重复m到n次(m-n-1),其中n可以省略,表示m到任意次下面用个简单的代码给大家看一下:importre num='123456768&#x

  • toString如何转json

    试想一个问题:如果我们已知Java对象的toString格式,想要获取其json格式或者其Java对象,该如何做呢?注意:Java对象的toString格式目前没有规范规定其格式,毕竟可以自定义对象toString方法,不过一般情况下对象的toString的格式如下所示。通过toString获取Java对象的话,只要将toString转json后再通过JSON.parseObject()转成对象即可,现在剩下的问题就是toString转json了。@Data publicclassPerson{ privateStringname="张三"; privateIntegerage=27; } toString:Person(name=张三,age=27) 复制在具体分析toString转json问题之前,我们首先来看下Java中常见的几种数据序列化格式吧,日常开发中接触到的对象格式主要分为以下两大类:强类型格式:javaSerializable、hession、Thrift、Protobuf等。弱类型格式:json、xml等。上述数据类型格式基本都对应至少1个序列化框

  • 单体转向微服务架构-基础篇

    前言目前从事于教育行业,尽管如今用户量并不是特别多,但我们的产品有点庞大。基于目前的单体架构,有众多的弊端,由于前期用户量并不多,产品迭代不是很频繁,相应的问题并没有凸显。但是随着团队越来越大,相应的沟通成本、管理成本、人员协调成本显著增加。引起缺陷的原因组合多,导致分析、定位、修复缺陷的成本响应增高。在自动化测试机制不完善的情况下,易导致“修复越多,缺陷越多”的恶性循环。我们一直正在关注当前的流行趋势,并试图从单体转向微服务架构。鉴于人员配比以及开发周期,我们不可能推到重构。那么如何使用微服务改造遗留系统,我们基于以下几点考虑:最小修改功能剥离数据解耦迭代替换首先,我们整理边缘业务,把后端服务抽离出来。新的框架使用SpringBoot+JPA(相对来说,我们有一套快速开发的脚手架);由于是前后端分离,认证采用相对简单的JWT;鉴于后期会拆分为多个服务,这里使用Zuul作为网关,Eureka作为服务注册中心。SpringCloudSpringCloud基于SpringBoot实现,使用HTTP的RESTful风格API作为调用方式。它所包含的多个子项目共同构建了微服务架构体系。Spri

  • 机器学习9:采样

    目录:一,采样概述:二,常用的几种采样技术:1,均匀采样:2,逆变换采样 3,拒绝采样4,重要性采样5,马尔可夫蒙特卡洛采样法6,贝叶斯网络的采样7,不均衡样本集的重采样7.1,基于数据的方法7.1.1,SMOTE算法7.2,基于算法的方法三,蒙特卡洛求解定积分:1,投影法2,期望法四,代码实现:1,马尔可夫平稳收敛性验证2,对Beta分布进行采样一,采样概述:采样本质上是对随机现象的模拟,根据给定的概率分布,来模拟产生一个对应的随机事件。采样可以让人们对随机事件及其产生过程有更直观的认识。采样得到的样本集也可以看作是一种非参数模型,即用较少量的样本点(经验分布)来近似总体分布,并刻画总体分布中的不确定性。从这个角度来说,采样其实也是一种信息降维,可以起到简化问题的作用。另外,利用重采样技术,可以在保持特定的信息下(目标信息不丢失),有意识地改变样本的分布,以更适应后续的模型训练和学习,例如利用重采样来处理分类模型的训练样本不均衡问题。此外,很多模型由于结构复杂、含有隐变量等原因,导致对应的求解公式比较复杂,没有显式解析解,难以进行精确求解或推理。在这种情况下,可以利用采样方法进行随机

  • 【精选好文】Reddit如何统计每个帖子的浏览量

    之前没听过也没了解过HyperLogLog,通过翻译这篇文章正好简单学习下。欢迎指正错误~我们想要更好的向用户展示Reddit的规模。为了这一点,投票和评论数是一个帖子最重要的指标。然而,在Reddit上有相当多的用户只浏览内容,既不投票也不评论。所以我们想要建立一个能够计算一个帖子浏览数的系统。这一数字会被展示给帖子的创作者和版主,以便他们更好的了解某个帖子的活跃程度。在这篇博客中,我们将讨论我们是如何实现超大数据量的计数。计数机制对于计数系统我们主要有四种需求:1、帖子浏览数必须是实时或者近实时的,而不是每天或者每小时汇总。2、同一用户在短时间内多次访问帖子,只算一个浏览量。3、显示的浏览量与真实浏览量间允许有小百分之几的误差。4、Reddit是全球访问量第八的网站,系统要能在生产环境的规模上正常运行,仅允许几秒的延迟。要全部满足以上四个需求的困难远远比听上去大的多。为了实时精准计数,我们需要知道某个用户是否曾经访问过这篇帖子。想要知道这个信息,我们就要为每篇帖子维护一个访问用户的集合,然后在每次计算浏览量时检查集合。一个naive的实现方式就是将访问用户的集合存储在内存的hash

  • 使用ResourceBundle读取配置文件

    使用ResourceBundle读取配置文件的例子如下:packagecom.yawn; importjava.io.IOException; importjava.util.Locale; importjava.util.ResourceBundle; publicclassTestBudle{ publicstaticvoidmain(String[]args)throwsIOException{ //使用getBundle方法加载ResourceBundle类 // ResourceBundleresourceBundle=ResourceBundle.getBundle("com.yawn.Resource",Locale.CHINA); ResourceBundleresourceBundle=ResourceBundle.getBundle("com.yawn.Resource",Locale.ENGLISH); System.out.println(resourceBundle.getString("

  • Teradata:数字银行的根本是如何利用技术来实时掌控和分析数据

    两会期间,中国建设银行行长张建国委员半开玩笑地说:“银行也是弱势群体啊。”当时包含李克强总理在内的所有人都笑了。但仔细品味,“弱势”一词固然指的是利率市场化改革对金融的影响,另一方面也折射出互联网金融等创新模式给金融产业转型带来的压力。在银行的发展中,ATM、实体分支银行、呼叫中心和数字化银行代表了四类渠道。而从不同行业的对比来看,尽管传统观点总是认为由于种种因素,银行对新技术的采用比较慢,但实际上,却远超其他行业的速度。尤其是在中国。“从新技术采用程度来看,数字化银行增速猛,目前已经超过其他渠道的总和。”Teradata天睿公司北亚地区金融服务行业咨询主管VinceLeat表示:“不管是移动设备还是网银的客户数量,都不是用百万或千万计,而是以亿或者十亿作为单位来计算,关键是他们在日常生活中会频繁使用各类银行服务,这真是令人震惊。比如,春节通过电子方式发放红包的数量已经达到了350亿。”不止如此,“依赖互联网而产生的互联网银行,比如深圳前海微众银行(WeBank),正在稳健扩大业务范围。而这样的银行,至少还有5家。”银行要创新,从技术角度来看,就需要对内,整合全数据;对外,整合不同数据

  • 不该缺少的Error体系

    导语:几乎所有APP在开发过程中都会遇到错误,一些错误是在控制之外,例如磁盘空间不足或网络连接失败。而一些错误是可以预料得到的,例如视频正在处理中无法播放、传入的参数非法等。而这些错误的信息如果友好的告诉业务方或者用户呢?前言几乎所有APP在开发过程中都会遇到错误,一些错误是在控制之外,例如磁盘空间不足或网络连接失败。而一些错误是可以预料得到的,例如视频正在处理中无法播放、传入的参数非法等。而这些错误的信息如果友好的告诉业务方或者用户呢?在iOS开发中最常见的方式之一是使用NSError,比如使用很广的AFNetworking,它就会常常返回一些错误信息告诉用户。而在手Q或者兴趣部落的项目中都没有一套整齐的Error体系,所以我们得需要进一步了解NSerror是什么东西才能制定出我们想要的东西。NSError包括什么在整个Error体系中主要包括三块内容,如下:ErrorDomainErrorCodeTheUserInfoDictionaryDomainErrorDomain是指区域,它是由一个字符串组成的。比如OSX系统Carbon框架的domain为(NSOSStatusError

  • 关于Spring中@Order 、@AutoConfigureBefore等与顺序相关注解的使用误区

    关于Spring中@Order、@AutoConfigureBefore等与顺序相关注解的误区 1、@Order注解并非一定会给你的bean排序 ​ @Order注解表示排序,但是它不能决定@Configuration或者是@Bean注解的实例化顺序。决定Spring里bean实例化或者注入顺序的一般情况下是bean之间的依赖关系。这个依赖关系一般是类的构造函数的参数、类属性或者@DependsOn注解来控制。 ​ 以下是错误的演示,Test1Config和Test2Config两个配置类的实例化,包括Apple和Orange的实例化都无法用@Order注解控制,调换顺序后可以发现实例化的顺序不会变化,因为他们之间并没有依赖关系。 @Configuration @Order(100) publicclassTest1Config{ publicTest1Config(){ System.out.println("Test1Config构造"); } @Bean publicAppleapple(){ System.out.println("准备newApple..."); retur

  • 清理系统缓存

    清理系统缓存当服务器内存使用率高达90%以上时,且有较大耗内存操作时,可以考虑把系统的垃圾内存清理掉。方法如下  echo3>/proc/sys/vm/drop_caches ~#free      total    used       free     shared      buffersMem:   155728    119840      35888      176       28-/+buffers:        119812      35916Swap:000~#echo3>/proc/sys/vm/drop_caches~#free    total    used     free   shared   buffersMe

  • Linux内核源码—list_entry(2.6.26.1)

    list_head 在Linux内核中是通过链表的形式来管理进程的,其定义非常简单(/include/linux/list.h): structlist_head{ structlist_head*next,*prev; }; 复制 只有两个指针,不包含其他数据,那怎么通过list_head将进程连接起来呢? Linux的做法是将list_head放入结构体中,比如下面的sched_rt_entity(/include/linux/sched.h): structsched_rt_entity{ structlist_headrun_list; unsignedinttime_slice; unsignedlongtimeout; intnr_cpus_allowed; structsched_rt_entity*back; #ifdefCONFIG_RT_GROUP_SCHED structsched_rt_entity *parent; /*rqonwhichthisentityis(tobe)queued:*/ structrt_rq *rt_rq;

  • swift __1 试写第一个swift程序

    参照:http://swiftist.org/topics/96?page=2#comments 发现有几个地方一直报错,自己修改了下,有可能是xcode6更新导致 代码写的比较乱,这是我的硬伤,这次注释还是后面加上的,这也是我的硬伤,需要改。养成良好的代码习惯。   下面贴上自己的代码 // //ViewController.swift //SwiftCounter // //Createdby三十一on14-8-20. //Copyright(c)2014年yetuoxun.Allrightsreserved. // importUIKit classViewController:UIViewController{ vartimeLable:UILabel?//显示剩余时间 vartimeButtons:[UIButton]?//设置时间的按钮数组 varstartStopButton:UIButton?//启动停止按钮 varclearButton:UIButton?//复位按钮 lettimeButtonInfos=[("1分",5),("3分",180),(

  • 微信公众号MAC下如何调试?

    0.环境描述 首先要有一个前端跑在本地的8888端口,可以通过localhost:8888访问 然后要有一个后端跑在本地的9999端口,可以通过localhost:9999访问(接口地址都要有个统一的头,这里是“api”) 然后要装一个“Charles” 然后当然还要装一个“微信开发者工具” 然后你的公众号需要必须要认证过 然后你必须要有一个已经备案的域名(这里假设是:abc.com) 然后你必须是这个公众号的开发人员(在公众号后台的“开发者工具”-“web开发者工具”里面加上自己的微信号) 然后设置JS接口安全域名和网页授权域名(在公众号后台的“公众号设置”-“功能设置”里面相应的地方下载txt文件并放到网站根目录下面) 至此,所有的前戏都做齐了,我们想要达到的效果是: 在“微信开发者工具”里面访问到我们8888的本地web,并且后端挂载的是我们本地9999的服务。 1.设置Charles 1)设置MapRemote,加入一条规则:https://www.abc.com/* -> http://localhost.charlesproxy.com:8888/

  • java中length,length(),size()区别

    java中length,length(),size()区别   1java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!这个例子来演示这两个方法和一个属性的用法publicstaticvoidmain(String[]args){String[]list={"ma","cao","yuan"};Stringa="macaoyuan";System.out.println(list.length);System.out.println(a.length());List<Object>array=newArrayList();array.add(a);System.out.println(array.size());}输出的值为:391 blog首页:http://w

  • 【学习笔记】QT环境搭建

    作者 作者:卢冬冬 邮箱:ezrobot@163.com 平台 主机:Ubuntu16.0464bit 版本:Qt5.12.3 注意 内容 1.简介 Qt是一个跨平台的C++图形用户界面库,我们平时所说所使用的Qt,准确的来说是它的GUI编程部分。Qt提供给应用程序开发者建立图形用户界面所需要的功能,并且Qt很容易扩展。基本上,Qt和XWindow上的Motif、Openwin、GTK等图形界面库和Windows平台上的MFC、OWL、VCl以及ATl是相同类型的东西。 2.安装 第1步:到官网(download.qt.io/archive/qt/5.12/5.12.3/)下载QT安装包,此处本人选择的是qt-opensource-linux-x64-5.12.3.run。 第2步:打开终端,依次输入以下命令,进行安装。 #添加文件执行权限 chmod+xqt-opensource-linux-x64-5.12.3.run #安装文件到/opt/目录 sudo./qt-opensource-linux-x64-5.12.3.run #进入QT安装目

  • 2013多校第四场

    hdu4632 题意:给你一个长度为n的字符串,求包含几个回文序列? 分析:dp[i][j]表示区间[l,r]内包含的回文序列的个数, dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]; if(s[i]==s[j])dp[i][j]+=dp[i+1][j-1]+1; 也可以用别的递推方式,比如dp[i][j]=SUM(dp[k][j-1]+1)+1(s[k]==s[j],i<=k<j) 可以递推求dp[i][j]=dp[i+1][j]+tmp;这样时间还是O(n^2); 1#include<cstdio> 2#include<cstring> 3#include<iostream> 4#include<algorithm> 5#include<cmath> 6#include<vector> 7#include<cstdlib> 8#include<set> 9usingnamespacestd; 10constintN=100

  • 使用sqoop将hive分区表的数据导入到mysql的解决方案:shell脚本循环

    方案1:使用shell脚本进行dowhile循环,挨个分区输出。从开始的分区一直循环到结束分区即可。本例子为月,若需日,改为%Y-%m-%d即可,-1month改为-1day即可 partition_month=`date-d"$start_date"+"%Y-%m"`partition_month_end=`date-d"$end_date"+"%Y-%m"`while[[${partition_month}<$partition_month_end]]dosqoopeval--connect"jdbc:mysql://。。。。。。。。。。。--password"。。。。。。--input-null-string'\\N'--input-null-non-string'\\N'\--table表的名字\--export-dirhdfs://。。。/hive/warehouse/路径/表名字/分区字段=$partition_month\--input-fields-terminated-by'\001';partition_month=`date-d"$partition_mon

  • oracle踩坑

      好久没有写博客了,就分享一些乱七八糟的东西吧! 1.oracle递归查询   大家应该使用有的时候会使用递归查询数据库菜单的吧,比如下面这样的(偷的图)( ̄▽ ̄)ノ   这种一般是业务管理系统比较多,比如菜单树,权限树或者机构树等等,从数据库中查询出的数据,然后使用java代码构建成前端需要的树的结构,然后返回给前端,ui组件渲染展示   所以通常我们会有下面这种的表(oracle版本建表语句可以自己做修改),有着父节点和字节点的关系,就是id和parent_id CREATETABLEjrbac_menu(idnumber(8)primarykeynotnull,--主键idreal_namevarchar(50)NULL,parent_idvarchar(50)NULL,  -- 父级菜单idurl_pathvarchar(500)NOTNULL,iconvarchar2(20)null,tordervarchar(50)NOTNULL);INSERTINTOjrbac_menuVALUES(1,'Forms',null,'forms.html

相关推荐

推荐阅读