数学知识小记

2017/05/19 12:12:53.

真de弱智,今天连等差数列求和公式都忘了...

1.等差数列.

通项公式:a(n) = a(1) + (n-1)*d;

前n项和: S(n) = n*a(1) + n*(n-1)/2*d;

变形:S(n) = (a(1) + a(n))*n/2;

2.等比数列.

通项公式:a(n) = a(1)*q^(n-1);

前n项和:S(n) = a(1)*(1 - q^n)/(1-q);

变形:S(n) = (a(1) - a(n)*q)/(1-q);


2017/06/28 00:46:41

regular convex polygon with n sides.(具有n条边的规则凸多边形)

求内角度和为:(n-2)*180


所以求规则凸多边形的单个内角度为:(n-2)*180/n


2017/07/06 17:46:52

因数:不包括零的任意数(正数和负数)。

正因数:不包括零的任意正数。


2017/07/29 23:45:47

鸽巢原理:

n+1个物体放入n个盒子,那么至少有一个盒子包含两个或更多的物体。

应用:

n个数中,必然存在j,k(j<=k)满足Aj,Aj+1...Ak-1,Ak的和是n的倍数。

分析:进行求(A1),(A1+a2),(A1+A2+A3),...,(A1+A2...An)。

① 如果存在一个%n = 0的,则直接证明得存在。

② %n都不等于0,而%n不为0的个数为n-1个,则根据鸽巢原理能够得到肯定存在两个或更多模数相同的数,所以找到这两个模数相同的位置便是j,k。


2017/07/31 15:06:21

求一个数的所有质因子

#include <stdio.h>
int num[1005], cnt;
void ZhiYinZi(int n)
{
	cnt = 0;
	for(int i = 2 ; i*i <= n; ++i)
	{ 
		if(n%i == 0)
		{
			num[++cnt] = i;
			while(n%i == 0) n /= i;
		}
	}
	if(n > 1) num[++cnt] = n;
}
int main()
{
	int n; scanf("%d", &n);
	ZhiYinZi(n);
	for(int i = 1; i <= cnt; ++i)
		printf("%d ", num[i]);
	puts("");
	return 0;
}


O(1)求从1到N的异或:

LL xor_n(LL n)  
{
    LL t = n & 3;  
    if(t & 1) return t/2ll^1; 
    return t/2ll^n;
}


判断组合数的奇偶性:

int isodd(int n, int m)
{
	while(m)
	{
		if((m&1) && !(n&1)) return 0;
		m >>= 1, n >>= 1;
	}
	return 1;
}
//OR
int isodd(int n, int m)
{
	return (n&m) == m;
}


给定两个数m,n,求m!分解质因数后因子n的个数。如果相乘直接求的话会超出数据类型的范围。下面给出一种效率比较高的算法,我们一步一步来。
m! = 1*2*3*……*(m-2)*(m-1)*m
可以表示成所有和n的倍数有关的乘积再乘以其他和n的倍数没有关系的
   = (n*2n*3n*......*kn)*other
other是不含n因子的数的乘积,因为 kn<=m 而k肯定是最大值,所以 k = m/n
   = n^k*(1*2*......*k)*other  
   = n^k*k!*other     
从这个表达式中可以提取出k个n,然后按照相同的方法循环下去可以求出k!中因子n的个数。
每次求出n的个数的和就是m!中因子n的总个数。

ll work(int m, int b)
{
    ll ans = 0;
    while(m)
    {
        m /= b;
        ans += m;
    }
    return ans;
}



静待更新...

Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值