整数
数学归纳法(非常有用的证明方法)
数学归纳原理(弱归纳)
一个包含整数 \(1\) 的正整数集合如果具有以下性质,即若其包含整数 \(k\) ,则其也包含整数 \(k+1\),那么这个集合一定是所有正整数的集合。
高考要考的。
举个栗子,证明:
-
将 \(n=1\) 代入得 \(\sum_{i=1}^{1} i^{2} = 1\),结论显然成立。
-
假设公式对于 \(n\) 成立,即 \(\sum_{i=1}^{n} i^{2}=\frac{n(n+1)(2n+1)}{6}\) 成立,根据归纳假设有:
则结论成立。
第二数学归纳原理(强归纳)
对于包含 \(1\) 的正整数集合,如果它具有下述性质:
对于每一个正整数 \(n\) ,如果它包含全体正整数 \(1,2,···,n\) ,则它也包含正整数 \(n+1\) 。
那么这个集合一定是由所有正整数的集合。
斐波那契数
定义: \(\ \ f_{1}=1,\ \ f_{2}=1,\ \ 且对n\ge 3,有:\ \ f_{n}=f_{n-1}+f_{n-2}\)。
结论1: \(\sum_{i=1}^{n}f_{i}\ =\ f_{n+2}-1\)
证明如下:
根据定义可知:
把等式右边展开很容易消掉。
就可以得到结论。
当然,也可以通过数学归纳法进行证明,这里不再赘述。
结论2: 斐波那契数列比公比为 \(\alpha =\frac{1+\sqrt[]{5}}{2}\) 的等比数列增长得快。
可用第二数学归纳法,证明 \(n\ge 3时,有\ \ f_{n}>\alpha^{n-2}\):
- 通过计算可得,该不等式对于 \(n=3,4\) 时成立。
- 假设对于 \(k\le n\) 的所有整数 \(k\) 该不等式成立。因为 \(\alpha^2=\alpha+1\)
则有 :
根据假设,可知
故:
证毕.
结论3:设 \(n\) 为正整数 \(\alpha=\frac{1+\sqrt[]{5}}{2}\ \ \ \beta=\frac{1-\sqrt[]{5}}{2}\),则有:
可以用高中数学知识解决
整除
定义: 如果 \(a\) , \(b\) 为整数且 \(a\ne 0\) ,我们说 \(a\) 整除 \(b\) 是指存在整数 \(c\) 使得 \(b=ac.\) 如果 \(a\) 整除 \(b\) ,我们还称 \(a\) 是 \(b\) 的一个因子,且称 \(b\) 是 \(a\) 的倍数.
如果 \(a\)整除 \(b\),记为 \(a\mid b\) ,如果 \(a\)不能整除 \(b\),记为 \(a\nmid b\)
废话
整除的简单性质:
- 如果 \(a,b,c\) 为整数,且 \(a\mid b,b\mid c\) ,则有 \(a\mid c\).
- 如果 \(a,b,c,n,m\) 为整数且 \(c\mid a,c\mid b\),则有 \(c\mid (na+mb)\)
给你 \(n\) 个数 \(a_{1},a_{2}···a_{n}\),询问对于每一个 \(a_{i}\) 在数列中有多少数能被 \(a_{i}\)整除。
题解: 本题值域很小,可以根据元素的值建立映射关系,同时统计值域中对于每一个整数的答案,最后输出答案即可。
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,a[N],mp[N],ans[N];
inline int qr()
{
char a=0;int w=1,x=0;
while(a<'0'||a>'9'){if(a=='-')w=-1;a=getchar();}
while(a<='9'&&a>='0'){x=(x<<3)+(x<<1)+(a^48);a=getchar();}
return x*w;
}
int main()
{
n=qr();
int maxn=0;
for(register int i=1;i<=n;i++)
{
mp[a[i]=qr()]++;
maxn=max(maxn,a[i]);
}
for(register int i=1;i<=maxn;i++)
{
if(mp[i])
ans[i]+=mp[i]-1;
for(register int j=i*2;j<=maxn;j+=i)
ans[j]+=mp[i];
}
for(register int i=1;i<=n;i++)
printf("%d\n",ans[a[i]]);
return 0;
}
整除分块
求 \(\sum_{i=1}^{n}k\ \ mod\ \ i\).
题解:
显然, \(k\ mod\ i=k-\lfloor \frac{k}{i} \rfloor\)
要求的柿子转化为 \(\sum_{i=1}^{n}(k-\lfloor \frac{k}{i} \rfloor)=nk-\sum_{i=1}^{n}\lfloor \frac{k}{i} \rfloor\)
而 \(\lfloor \frac{k}{i} \rfloor\) 的不同取值数量小于 \(2\ \sqrt[]{n}\) 种,理由如下:
将 \([\ 1\ ,\ n\ ]\) 分为两部分 \([\ 1\ ,\ \sqrt[]{n}\ ]\) 和 \((\ \sqrt[]{n}\ ,\ n\ ]\).
- 对于 \(i\in [\ 1\ ,\ \sqrt[]{n}\ ]\) , \(\lfloor \frac{k}{i} \rfloor\) 最多有 \(\ \sqrt[]{n}\) 种取值。
- 对于 \(i\in (\ \sqrt[]{n}\ ,\ n\ ]\) , \(\lfloor \frac{k}{i} \rfloor\) 值域为 \([\ 1\ ,\ \sqrt[]{n}\ )\) , 故最多有 \(\ \sqrt[]{n}-1\) 种取值。
综上: \(\lfloor \frac{k}{i} \rfloor\) 的不同取值数量小于 \(2\ \sqrt[]{n}\) 种.
接下来要求出块的左右端点:
结论: 当有 \(\lfloor \frac{k}{l} \rfloor=\lfloor \frac{k}{r} \rfloor\) 时, \(r\) 的最大取值为\(\lfloor \frac{k}{ \lfloor \frac{k}{l} \rfloor} \rfloor\) ,自己证。
之后就可以通过 \(l,r\) 不断迭代的方式通过本题。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,k,ans;
inline int qr()
{
int w=1,x=0;char a=0;
while(a<'0'||a>'9'){if(a=='-')w=-1;a=getchar();}
while(a<='9'&&a>='0'){x=(x<<3)+(x<<1)+(a^48);a=getchar();}
return x*w;
}
int main()
{
n=qr();
k=qr();
ans=n*k;
LL l=1,r=0;
while(l<=n)
{
r= k/l!=0?min((k/(k/l)),n):n;
ans-=(r+l)*(k/l)*(r-l+1)/2;
l=r+1;
}
printf("%lld\n",ans);
return 0;
}