原创OI题目 GCD卷积 Problem and Solution

比赛用题面、题解、标程和数据生成器均已挂在 git@github.com:sun123zxy/gcdconv.git 上。

Problem

GCD卷积 (gcdconv.cpp/.in/.out) (1s,512MB)

Description

定义一种新的卷积 —— GCD卷积,其接受两个长度为 \(n\) 的序列 \(f,g\) ,依据下式生成长度为 \(n\) 的序列 \(h\)

\[h_k = \sum_{\gcd(i,j) = k} f_i g_j \]

现给定序列 \(f,g\) ,求各 \(h_i\)\(998244353\) 取模后的值。

Input

第一行输入一个正整数 \(n\) ,表示 \(f,g\) 的长度。

第二行输入 \(n\) 个整数 \(f_i\)

第三行输入 \(n\) 个整数 \(g_i\)

Output

为减少输出量,只需输出1个整数,表示各 \(h_i\)\(998244353\) 取模后的异或和。

Sample 1

Sample 1 Input

3
5 1 4
2 3 3

Sample 1 Output

78

Sample 1 Explanation

\[\begin{aligned} h_1 &= f_1 ( g_1 + g_2 + g_3 ) + g_1 (f_2 + f_3) + f_2 g_3 + f_3 g_2 = 65 \\ h_2 &= f_2 g_2 = 3 \\ h_3 &= f_3 g_3 = 12 \end{aligned} \]

\[65 \oplus 3 \oplus 12 = 78 \]

Sample 2

Sample 2 Input

4
7 1 8 0
6 2 9 1

Sample 2 Output

158

Sample 2 Explanation

\[\begin{aligned} h_1 &= 213 \\ h_2 &= 3 \\ h_3 &= 72 \\ h_4 &= 0 \end{aligned} \]

\[213 \oplus 3 \oplus 72 \oplus 0 = 158 \]

Sample 3

sample 目录下 gcdconv3.in/.ans

Constraints

对20%的数据,\(1 \le n \le 2000\)

对100%的数据, \(1 \le n \le 4 \times 10^5\)\(0 \le f_i, g_i \le 998244352\)

Hints

时限在std的1.5倍左右。std没有卡常,数据有一定梯度,请放心食用。

Source

sun123zxy

???

  • 样例2比较暴力。

记号说明

默认诸如 \(n,d,i,j,k\) 的下标变量的最大值为题目中的给出的序列长度,并把序列更换为数论函数来表示。

注意本题解中的 \(n\) 通常是一个变量,和题目中定义的序列长度 \(n\) 不同。

另外,用 \(\circ\) 代表 \(\gcd\) 卷积,即

\[h(n) = (f \circ g)(n) = \sum_{\gcd(i,j) = n} f(i) g(j) \]

Solution

我们按照快速傅里叶变换(FFT)、快速莫比乌斯变换(FMT)解决卷积的思路来解决该问题——构造一种变换来满足卷积定理:

\[\hat f(n) \hat g(n) = \widehat {(f \circ g)}(n) \]

\(\hat f\) 即对函数 \(f\) 进行该变换后得到的函数。

通过一些敏锐的直觉,我们能感受到 \(\gcd\) 和枚举约数或者倍数有一些关系。

容易想到构造出一种变换,称之为“倍数和变换”:

\[\hat f(n) = \sum_{n|d} f(d) \]

并根据莫比乌斯反演得到它的逆变换

\[f(n) = \sum_{n|d} \mu(\frac n d) \hat f(d) \]

(这实际上是标准莫比乌斯反演的另一种形式,详见后文 [Further Thoughts](#Further Thoughts) )

这个变换对 \(\gcd\) 卷积满足卷积定理,证明如下。

首先,写出 \(\gcd\) 卷积

\[h(k) = (f \circ g)(k) = \sum_{i,j} [\gcd(i,j)=k] f(i) g(j) \]

左右两边做倍数和变换:

\[\begin{aligned} \hat h(n) &= \sum_{n|k} \sum_{i,j} [\gcd(i,j)=k] f(i) g(j) \\ &= \sum_{i,j} \left( \sum_{n|k} [\gcd(i,j)=k] \right) f(i) g(j) \quad \\ &= \sum_{i,j} [n|i][n|j] f(i) g(j) \quad \\ &= \sum_{n|i} f(i) \sum_{n|j} g(j) \quad \\ &= \hat f(n) \hat g(n) \end{aligned} \]

得证。上述证明的核心在于 \(\sum_{n|k} [\gcd(i,j)=k] = [n|i] [n|j]\)

于是,先对 \(f,g\) 做倍数和变换,然后直接 \(O(n)\) 点值相乘,再逆变换回来,就能得到 \(f \circ g\)

那么剩下的问题在于如何快速做倍数和变换及其逆变换。这是非常simple的,直接暴力就好了。复杂度为 \(O(n H(n))\) ,其中调和级数 \(H(n)= \sum_{k=1}^{n} \frac 1 k\) ,有 \(\lim_{n \to \infty} H(n) = \ln(n) + c\) 。欧拉常数 \(c \approx 0.57721566490153286060651209\)

可以称之为“快速倍数和变换”。

总时间复杂度约为 \(O(n \ln n)\)

Code

/*
gcd卷积 (gcdconv) std
by sun123zxy 
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;

ll Rd(){
	ll ans=0;bool fh=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') fh=1; c=getchar();}
	while(c>='0'&&c<='9') ans=ans*10+c-'0',c=getchar();
	if(fh) ans=-ans;
	return ans;
}

const ll MOD=998244353;
#define _ %MOD
ll PMod(ll x){
	if(x<0) return x+MOD;
	else if(x>=MOD) return x-MOD;
	else return x;
}

const ll MXN=5E5+5;
ll P[MXN],mu[MXN];ll pN;
bool notP[MXN];
void LinearSieve(ll n){
	notP[1]=1;for(ll i=2;i<=n;i++) notP[i]=0;
	P[1]=0;mu[1]=1;
	pN=0;
	for(ll i=2;i<=n;i++){
		if(!notP[i]){
			P[++pN]=i;
			mu[i]=-1;
		}
		for(ll j=1;i*P[j]<=n;j++){
			notP[i*P[j]]=1;
			if(i%P[j]==0){
				mu[i*P[j]]=0;
				break;
			}
			mu[i*P[j]]=mu[i]*mu[P[j]];
		}
	}
}

class Poly{public:
	ll& operator [] (ll idx){return cof[idx];}
	ll n;vector<ll> cof;
	Poly(){}
	Poly(ll n){Resize(n);}
	void Resize(ll n){
		this->n = n;
		cof.resize(n+1,0);
	}
};
namespace PC{//PolyCalc
	void FMT(Poly& A,ll typ){
		ll n=A.n;
		Poly B(n);
		for(ll i=1;i<=n;i++){
			for(ll j=1;i*j<=n;j++){
				ll t=A[i*j];if(typ==-1) t=t*mu[j]_;
				B[i]=PMod(B[i]+t);
			}
		}
		A=B;
	}
	Poly GcdConv(Poly A,Poly B){
		ll n=min(A.n,B.n); 
		Poly C(n);
		FMT(A,1);FMT(B,1);
		for(ll i=1;i<=n;i++) C[i]=A[i]*B[i]_;
		FMT(C,-1);
		return C;
	}
}

ll N;

int main(){
	freopen("gcdconv.in","r",stdin);
	freopen("gcdconv_std.out","w",stdout);
	N=Rd();
	LinearSieve(N);
	Poly A(N),B(N);
	for(ll i=1;i<=N;i++) A[i]=Rd();
	for(ll i=1;i<=N;i++) B[i]=Rd();
	Poly C=PC::GcdConv(A,B);
	ll ans=0;
	for(ll i=1;i<=N;i++) ans^=C[i];
	printf("%lld",ans);
	return 0;
}

Further Thoughts

本题用到的是莫比乌斯反演的一种变形

\[g(n) = \sum_{n|d} f(n) \iff f(d) = \sum_{n|d} \mu(\frac n d) g(d) \]

原版莫比乌斯反演长这样

\[g(n) = \sum_{d|n} f(n) \iff f(d) = \sum_{d|n} \mu(\frac n d) g(d) \]

若把题目改成 \(\mathrm{lcm}\) 卷积,即

\[h_k = \sum_{\mathrm{lcm}(i,j) = k} f_i g_j \]

用到的就是原版莫比乌斯反演。相应的构造一个“约数和变换”即可解决。而约数和变换可以用“快速约数和变换”(实际上就是个埃筛)实现,有兴趣的同学可以试试。

Further Further Thoughts (update 2020/10/28)

我们来探讨一些更加接近本质的东西。

普通卷积(多项式乘法)、集合并/交卷积、还有 \(\mathrm{lcm}\) / \(\gcd\) 卷积,这三个问题我们是如何解决的?

关键在于——我们分别构造出了离散傅里叶变换、子集和/超集和变换(莫比乌斯变换)和约数和/倍数和变换来满足卷积定理。

而这三个变换的共性在哪里呢?

他们都是偏序集上的具有优美性质的广义反演。

  • 离散傅里叶变换用的是单位根反演——其偏序集是定义在自然数集上的小于等于关系;
  • 子集和/超集和变换用的是容斥原理——其偏序集是定义在集合上的包含关系;
  • 而约数和/倍数和变换则运用了莫比乌斯反演——其偏序集是定义在自然数集上的整除关系。

反演的意义就在于——它为将原来的“系数”转化为“点值”, \(O(n)\) 乘起来后又转回“系数”提供了可能。而这三个特殊的反演之所以优美,就是因为我们发现了他们的“快速 (Fast) ”变换方式,让我们能通过这个Trick,免去了 \(O(n^2)\) 的暴力运算。

还有更重要的一点——子集和/超集和变换与约数和/倍数和变换有着更加紧密的联系——这也是笔者由集合的FMT想到约数和变换的关键所在——以全体素数为基底可以张成一个包含全体正整数的“素数空间”(其良定义依赖于整数惟一分解定理)。

约数和变换就是“素数空间”中的高维前缀和,对应着“集合空间”中的子集和变换。换句话说,子集和变换、约数和变换分别是莫比乌斯变换在“素数空间”、“集合空间”的具体体现,它们的本质都是高维前缀和。

如果理解到上面这一点,就不难发现集合并卷积和 \(\mathrm{lcm}\) 卷积的共性了——他们都把数放到了对两个输入元素各维度坐标取 \(\max\) 后的位置;而集合交卷积和 \(\gcd\) 卷积则是取 \(\min\)

综上所述,有了上面的认识,可以说 \(\gcd\) 卷积的发现是非常自然的。

后记 & 致谢

Idea是在语文课上摸出来的,Solution是在随后的数学课上想出来的

很早以前就觉得FMT和莫比乌斯反演有些说不清道不明的关系,出这道题也让笔者对其理解更加深入了。

其实早有大佬对 \(\mathrm{lcm}\) / \(\gcd\) 卷积展开过研究。Google一波可以发现国外数学社区有这方面的讨论,最晚2013年arXiv上就有讨论其性质的论文了(笔者驽钝,确实无力理解,感兴趣的大佬可以直接Google "GCD Convolution"了解)。只可惜如此自然而美妙的 \(\gcd\) 卷积,竟然没有随着那篇集合幂级数的论文引入国内,让笔者感到有些遗憾。

总之,这道题深入的考察对FFT、FMT原理的理解以及对 \(\gcd\) 、莫比乌斯反演的敏锐直觉,是不可多得的数论好题(

下面是战术感谢环节。

感谢keke学长为我们教授集合幂级数。

感谢TbYangZ、diong神、changruinian2020几位神仙的点拨。

And you...

——sun123zxy

Sep. 2020 初稿完成

Nov. 2020 最后更新

本文转载于网络 如有侵权请联系删除

相关文章

  • kubernetes 问题排查: 高版本 containerd 下载镜像失败

    点击阅读原文可查看最新内容且直接跳转文中链接。问题描述在containerd运行时的kubernetes线上环境中,出现了镜像无法下载的情况,具体报错如下:Failedtopullimage&nbsp;``"ccr.ccs.tencentyun.com/tkeimages/tke-hpc-controller:v1.0.0"``:rpcerror:code=NotFounddesc=failedtopullandunpackimage&nbsp;``"ccr.ccs.tencentyun.com/tkeimages/tke-hpc-controller:v1.0.0"``:failedtounpackimageonsnapshotteroverlayfs:failedtoextractlayersha256:d72a74c56330b347f7d18b64d2effd93edd695fde25dc301d52c37efbcf4844e:failedtogetreaderfromcontentstore:contentdigests

  • 详解https请求Nginx转发tomcat变成http问题

    概述 分享一个最近处理的nginx转发问题,简单记录下~一、问题现象简单架构为nginx做负载均衡,后端用tomcat做容器。浏览器和Nginx之间走的HTTPS通讯,而Nginx到Tomcat通过proxy_pass走的是普通HTTP连接。通过域名访问可以正常登录,但是发现某个页面会存在异常,保存的时候会一直在加载中,具体原因为saved方法里面redirect重定向的时候变为http请求,当前页面为https协议,但是这个页面发起了一个http的ajax请求,这个是非法的。F12查看报错:Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS.如图:分析进一步分析后发现以下三个现象:1)在排查代码之后并没有发现代码里有任何写死使用http协议的地方,而后又发现另一个应用也出现了这个情况,两个应用使用的框架分别是struts2和spring,这个问题似乎和框架无关。2)而后发现原先部署在这两个应用之前的反向代理的协议从原来的http改成了https,但是这两个应用的tomcat并没有跟着升级成https而依旧是http。3)

  • 如何去写一手好SQL?

    来源:http://rrd.me/exKgYMySQL性能数据表设计索引优化SQL优化其他数据库MySQL性能最大数据量抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。博主曾经操作过超过4亿行数据的单表,分页查询最新的20条记录耗时0.6秒,SQL语句大致是selectfield_1,field_2fromtablewhereid<#{prePageMinId}orderbyiddesclimit20,prePageMinId是上一页数据记录的最小ID。虽然当时查询速度还凑合,随着数据不断增长,有朝一日必定不堪重负。分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分。对分库分表感兴趣的同学可以阅读分库分表的基本思想。最大并发数并发数是指同一时

  • Markets and Market报告:预测2023年AR市场将达613.9亿美元

    近日,全球第二大市场研究咨询公司MarketsandMarket发布了一则AR市场报告,数据显示:AR市值预计将从2016年23.9亿美元增长至2023年的613.9亿美元,复合年均增长率约为55.71%。此外,报告还预测,由于越来越多的智能手机、平板电脑以及其他设备中将加入AR技术,AR软件市场将在2023年之前引爆市场。随着计算机技术的进步,越来越多的AR设备被广泛的运用于各个领域。而AR头显作为AR市场最有潜力的增长点,占据了市场主要份额。在消费应用市场,用于游戏和娱乐的AR头显越来越受到消费者的青睐。在商业市场,医疗保健、零售和电商等领域对于AR头显的需求也在不断增加。商业领域的需求也成为了AR发展的主要推动力。MarketsandMarkets报告还指出了当前制约AR市场的主要因素:有限的用户界面(UI)会影响AR应用的导航性能,以及AR设备处理能力不足和较小存储容量,都将影响AR市场的发展。MarketsandMarkets报告同时还分析了当前AR市场的主要参与者,包括Google、PTC、MicrosoftCorporation、Blippar、MagicLeap等一些美

  • CLR异常处理的流程

    因为微软的很多东西都没开源,比如Windows系统部分,虽然CLR开源了,但是作为微软的东西跟windows千丝万缕的联系。此处整理了下CLR异常处理部分的内容:通过RyuJit生成的IL_Throw函数调用RaiseException。后面的流程如下: RaiseException-》__imp_RaiseException-》__imp_RtlRaiseException-》RtlLookupFunctionEntry-》RtlpxLookupFunctionTableRaiseException-》__imp_RaiseException-》__imp_RtlRaiseException-》RtlVirtualUnwindRaiseException-》__imp_RaiseException-》__imp_RtlRaiseException-》RtlpGuardSynchronizeRestorePcRaiseException-》__imp_RaiseException-》__imp_RtlRaiseException-》NtRaiseException我们可以看到最后有个N

  • k8s 中的 Pod 细节了解

    k8s中Pod的理解 基本概念 k8s为什么使用Pod作为最小的管理单元 如何使用Pod 1、自主式Pod 2、控制器管理的Pod 静态Pod Pod的生命周期 Pod如何直接暴露服务 hostNetwork hostPort hostNetwork和hostPort的对比 Label 亲和性调度 什么是亲和(affinity)与反亲和(anti-affinity)调度 Node亲和性调度策略 Pod亲和性调度 NodeSelector定向调度 资源限制 Pod的持久化存储 1、emptyDir 2、hostPath 3、Pod持久化存储 Pod的探针 使用HPA实现Pod的自动扩容 HPA是如何工作的 总结 参考 k8s中Pod的理解 基本概念 Pod是Kubernetes集群中能够被创建和管理的最小部署单元,它是虚拟存在的。Pod是一组容器的集合,并且部署在同一个Pod里面的容器是亲密性很强的一组容器,Pod里面的容器,共享网络和存储空间,Pod是短暂的。 k8s中的Pod有下面两种使用方式 1、一个Pod中运行一个容器,这是最常见的

  • day15

    学习过程与总结:   前两天老师给我们发布了项目任务 遇到的困难:   hive数据库里面的数据不能导出到MySQL数据库里 思维导图:  

  • 输入框内容换行转译

    文本框换行转译 data.indexOf('\\n')!='-1' data.replace(/\\n/g,"\r"), else data.replace(/\\r/g,"/r")   html换行转译 data.indexOf('\\n')!='-1' data.replace(/\\n/g,"<br/>") else data.replace(/\\r/g,"<br/>")

  • 启动项目报错:Error: error:0308010C:digital envelope routines::unsupported

    启动项目报错信息如下: Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:71:19)atObject.createHash(node:crypto:133:10)atmodule.exports(/Users/xxxxxxx/node_modules/webpack/lib/util/createHash.js:90:53)atNormalModule._initBuildHash(/Users/xxxxxxx/node_modules/webpack/lib/NormalModule.js:386:16)athandleParseError(/Users/xxxxxxx/node_modules/webpack/lib/NormalModule.js:434:10)at/Users/xxxxxxx/node_modules/webpack/lib/NormalModule.js:466:5at/Users/xxxxxxx/node_modules/

  • Linux之服务器介绍

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。 服务器:服务器指的是网络中能对其他机器提供某些服务的计算机系统,相对普通PC,服务器指的是高性能计算机,稳定性、安全性要求更高服务器的高性能体现在高速的运转能力,长时间的可靠运行,强大的数据吞吐能力 服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。 在网络环境下,根据服务器提供的服务类型不同,分为文件服务器、数据库服务器、应用程序服务器、WEB服务器等。   上图是服务器机房照片 机房服务器运行环境要求: 1、温度。空调用来控制数据中心的温度和湿度,制冷与空调工程协会的“数据处理环境热准则”建议温度范围为20-25℃(68-75℉),湿度范围为40-55%,适宜数据中心环境的最大露点温度是17℃。 2、电源。机房的电源由一个或多个不间断电源(UPS)和/或柴油发电机组成备用电源。为了避免出现单点故障,所有电力系统,

  • 查看本地安装的sql server是什么版本

    方法一:查询语句 SELECT@@VERSION返回当前安装的日期、版本和处理器类型。例如:结果为: MicrosoftSQLServer2008(RTM)-10.0.1600.22(IntelX86)  Jul 9200814:43:34  Copyright(c)1988-2008MicrosoftCorporation EnterpriseEditiononWindowsNT6.0(Build6001:ServicePack1) 方法二: 进入sqlservermanagementstudio,右键对象管理器——选择属性:在产品所在记录可以看到版本信息。 说明:SQL2008 express版本不支持维护计划 参考文章点我

  • hdu6468 zyb的面试 (思维)

    题目传送门 题意: 将1~n个数按字典序排序后,求第k个数   思路:   代码:   #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<map> usingnamespacestd; typedeflonglongll; intans; intn,k; boolflag; intcnt; voiddfs(intx,int&cnt) {//cout<<x<<""<<cnt<<endl; if(flag)return; if(x>n||cnt>k)return; if(cnt==k){ ans=x; flag=1; return; } for(inti=10*x;i<10*(x+1);i++) { if(i&

  • python3写一个简单购物车代码

    1、完整代码如下 ##定义一个商品列表 shopping_list=[ ("iphone14",12000), ("iphone13pm",11000), ("bike",600), ("coffee",30), ("macbook",30000) ] ##定义一个空的购物车 carts_list=[] salary=input("请输入的您的消费资金:") ##判断输入的现金是正确的数字且转化为int类型,否则打印输入错误。 ifsalary.isdigit(): salary=int(salary) whileTrue: #forindex,iterminenumerate(shopping_list): #打印商品列表 foriterminshopping_list: print(shopping_list.index(iterm),"、",iterm) #用户选择要购买的商品,对输入进行判断 user_choice=input("请选择你要买的商品序列号,或者输入q退出:") ##用户输入正确,转换为数字 ifuser_choice.isdigit(): use

  • Go 中的单元测试和基准测试

    首先所有的包都应该有一定的必要文档,然后同样重要的是对包的测试。   名为testing的包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能。   备注:gotest是Unixbash脚本,所以在Windows下你需要配置MINGW环境;在Windows环境下把所有的pkg/linux_amd64替换成pkg/windows。   对一个包做(单元)测试,需要写一些可以频繁(每次更新后)执行的小块测试单元来检查代码的正确性。于是我们必须写一些Go源文件来测试代码。测试程序必须属于被测试的包,并且文件名满足这种形式*_test.go,所以测试代码和包中的业务代码是分开的。   _test程序不会被普通的Go编译器编译,所以当放应用部署到生产环境时它们不会被部署;只有gotest会编译所有的程序:普通程序和测试程序。   测试文件中必须导入"testing"包,并写一些名字以TestZzz打头的全局函数,这里的Zzz是被测试函数的字母描述,如TestFmtInterface,TestPayEmployees等。   测试函数必须有这种形式的头部: funcTest

  • Java程序运行基础知识

    Java语言的口号就是,一次编译,到处运行! 源代码 当我们写java程序的时候,程序文件的扩展名是.java,这就是我们所说的源代码;操作系统只能识别、运行二进制格式的文件(解释型语言实际也需要这个过程),所以这样的源文件是没办法直接运行的,需要通过编译器对源代码进行编译。 环境变量 所有运行Java程序的软件都需要JDK,但是JDK是可以安装在任何一个目录下的,那么其他软件怎么知道JDK在哪里呢?它们又是怎么能够找到JDK呢?这就是JAVA_HOME的价值了,JDK告诉其他软件,如果你们想找我的话就先去找JAVA_HOME这个环境变量吧,它的值就是我的安装目录,当你改变了JDK的安装目录,只需要把JAVA_HOME这个环境变量的值更新一下不就可以了吗?所以你也应该知道这个环境变量怎么配置,以及它的重要性了吧?                

  • VS2012添加ADO实体数据模型

    最近更新了开发工具为VS2012,在使用EntityFramework创建实体数据模型的时候,在添加选项中找不到这个选项。 确定了自己已经安装了EntityFramework,猜到估计是版本的问题,于是重新搜索下载了EntityFramework6. 下载地址如下:http://www.microsoft.com/en-us/download/details.aspx?id=40762 安装的时候要关闭VS2012,安装完毕之后就能找到了。

  • 网络实时监控工具

    yuminstallepel* yuminstalliptraf-ng-y yuminstallifctop-y #查看网络接口的网络实施带宽中哪个IP带宽占用比较大 iftop-ieth0 #显示每个连接以及主机之间传输的数据量 iptraf-ng  #执行后根据提示选择监控项

  • 结构化方法与面向对象方法之比较

                            结构化方法与面向对象方法之比较   软件开发的方法众多,其中最具有代表性的是结构化方法与面向对象方法。这两种方法在软件开发中有着广泛的应用。由于其解决问题的思想不同,使用的手段不同,在不同的问题环境下,也各有优劣。     一、结构化方法      结构化方法(SD)是传统的软件开发方法之一,它把问题的求解过程分阶段进行,自顶向下逐层分解,使得每个阶段处理的问题都控制在可控的范围内。结构化方法主要由结构化分析、结构化设计、结构化程序设计这三部分有机组合而成。   1、结构化分析   结构化分析是一种面向数据流的系统分析方法。一般为自顶向下逐步求解,以一系列已经被认为视正确的原理与技术为支撑,使用数据流图、数据字典、判定树、判定表等手段,使开发方法和系统具有合理性。   数据流图:   反映系统中需要完成的逻辑功能,是一种功能模型,一般在需求分析阶段产生。数据流图可以根据层级分为顶层数据流图、中层数据流图、底层数据流图。顶层数据流图用一个加工来表示整个系统,输出的数据流和输入的数据流为系统的

  • C#函数式编程

    编程语言范式 常见的编程范式有命令式编程(Imperativeprogramming),函数式编程,逻辑式编程; 许多现存的编程语言都可基于其计算模型加以分类,归入某些语言族,或者属于某种编程范式。按照不同的规则,可以有多种分类的方法,而且不同的学者对某些语言的具体归属也有不同的意见。 给出一种系谱: 说明式(Declarative)                  命令式(Imperative)   函数式 Lisp,ML,Haskell               冯诺依曼C,Ada,Fortran   数据流 ld,Val         &nb

  • JFileChooser记住上次选择的路径

    StringsaveFolder="C:\\"; Preferencespref=Preferences.userRoot().node( this.getClass().getName()); StringlastPath=pref.get("lastPath",""); JFileChooserfc=null; if(!lastPath.equals("")){ fc=newJFileChooser(lastPath); }else{ fc=newJFileChooser(saveFolder); } saveFolder=fc.getSelectedFile().getPath(); pref.put("lastPath",saveFolder);复制  

  • css 四角边框

    .rect{   background:linear-gradient(toleft,#196aa8,#196aa8)lefttopno-repeat,         linear-gradient(tobottom,#196aa8,#196aa8)lefttopno-repeat,         linear-gradient(toleft,#196aa8,#196aa8)righttopno-repeat,         linear-gradient(tobottom,#196aa8,#196aa8)righttopno-repeat,         linear-gradient(toleft,#196aa8,#196aa8)leftbottomno-repeat,         linear-gradient(tobottom,#196aa8,#196aa8)leftbottomno-repeat,         linear-gradient(toleft,#196aa8,#196AA8)rightbottomno-repeat,         linear-

相关推荐

推荐阅读