数学归纳法(非常有用的证明方法)
数学归纳原理(弱归纳)
一个包含整数 1 1 1 的正整数集合如果具有以下性质,即若其包含整数 k k k ,则其也包含整数 k + 1 k+1 k+1,那么这个集合一定是所有正整数的集合。
高考要考的。
举个栗子,证明:
∑
i
=
1
n
i
2
=
n
(
n
+
1
)
(
n
+
2
)
6
\sum_{i=1}^{n} i^{2}=\frac{n(n+1)(n+2)}{6}
i=1∑ni2=6n(n+1)(n+2)
-
将 n = 1 n=1 n=1 代入得 ∑ i = 1 1 i 2 = 1 \sum_{i=1}^{1} i^{2} = 1 ∑i=11i2=1,结论显然成立。
-
假设公式对于 n n n 成立,即 ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^{n} i^{2}=\frac{n(n+1)(2n+1)}{6} ∑i=1ni2=6n(n+1)(2n+1) 成立,根据归纳假设有:
∑ i = 1 n + 1 j 2 = n ( n + 1 ) ( 2 n + 1 ) 6 + ( n + 1 ) 2 把 i = n + 1 项 分 离 出 来 = n ( n + 1 ) ( 2 n + 1 ) + 6 ( n + 1 ) 2 6 = ( n + 1 ) ( 2 n 2 + 7 n + 6 ) 6 = ( n + 1 ) ( n + 2 ) ( 2 n + 3 ) 6 \begin{aligned} \sum_{i=1}^{n+1} j^{2}&=\frac{n(n+1)(2n+1)}{6} +(n+1)^2\ \ 把i=n+1项分离出来 \\ &=\frac{n(n+1)(2n+1)+6(n+1)^2}{6} \\ &=\frac{(n+1)(2n^2+7n+6)}{6} \\ &=\frac{(n+1)(n+2)(2n+3)}{6} \\ \end{aligned} i=1∑n+1j2=6n(n+1)(2n+1)+(n+1)2 把i=n+1项分离出来=6n(n+1)(2n+1)+6(n+1)2=6(n+1)(2n2+7n+6)=6(n+1)(n+2)(2n+3)
则结论成立。
第二数学归纳原理(强归纳)
对于包含 1 1 1 的正整数集合,如果它具有下述性质:
对于每一个正整数 n n n ,如果它包含全体正整数 1 , 2 , ⋅ ⋅ ⋅ , n 1,2,···,n 1,2,⋅⋅⋅,n ,则它也包含正整数 n + 1 n+1 n+1 。
那么这个集合一定是由所有正整数的集合。
斐波那契数
定义: f 1 = 1 , f 2 = 1 , 且 对 n ≥ 3 , 有 : f n = f n − 1 + f n − 2 \ \ f_{1}=1,\ \ f_{2}=1,\ \ 且对n\ge 3,有:\ \ f_{n}=f_{n-1}+f_{n-2} f1=1, f2=1, 且对n≥3,有: fn=fn−1+fn−2。
结论1: ∑ i = 1 n f i = f n + 2 − 1 \sum_{i=1}^{n}f_{i}\ =\ f_{n+2}-1 ∑i=1nfi = fn+2−1
证明如下:
根据定义可知:
∑ i = 1 n f k = ∑ i = 1 n ( f k + 2 − f k + 1 ) \sum_{i=1}^{n}f_{k}=\sum_{i=1}^{n}(f_{k+2}-f_{k+1}) i=1∑nfk=i=1∑n(fk+2−fk+1)
把等式右边展开很容易消掉。
就可以得到结论。
当然,也可以通过数学归纳法进行证明,这里不再赘述。
结论2: 斐波那契数列比公比为 α = 1 + 5 2 \alpha =\frac{1+\sqrt[]{5}}{2} α=21+5 的等比数列增长得快。
可用第二数学归纳法,证明 n ≥ 3 时 , 有 f n > α n − 2 n\ge 3时,有\ \ f_{n}>\alpha^{n-2} n≥3时,有 fn>αn−2:
- 通过计算可得,该不等式对于 n = 3 , 4 n=3,4 n=3,4 时成立。
- 假设对于
k
≤
n
k\le n
k≤n 的所有整数
k
k
k 该不等式成立。因为
α
2
=
α
+
1
\alpha^2=\alpha+1
α2=α+1
则有 :
α n − 1 = α 2 ∗ α n − 3 = ( α + 1 ) ∗ α n − 3 = α n − 2 + α n − 3 \begin{aligned} \alpha^{n-1}&=\alpha^2*\alpha^{n-3}\\ &=(\alpha+1)*\alpha^{n-3}\\ &=\alpha^{n-2}+\alpha^{n-3}\\ \end{aligned} αn−1=α2∗αn−3=(α+1)∗αn−3=αn−2+αn−3
根据假设,可知
f n > α n − 2 f n − 1 > α n − 3 f_{n}>\alpha^{n-2}\ \ \ \ \ \ f_{n-1}>\alpha^{n-3} fn>αn−2 fn−1>αn−3
故:
f n + 1 = f n + f n − 1 > α n − 2 + α n − 3 = α n − 1 f_{n+1}=f_{n}+f_{n-1}>\alpha^{n-2}+\alpha^{n-3}=\alpha^{n-1} fn+1=fn+fn−1>αn−2+αn−3=αn−1
证毕.
结论3:设 n n n 为正整数 α = 1 + 5 2 β = 1 − 5 2 \alpha=\frac{1+\sqrt[]{5}}{2}\ \ \ \beta=\frac{1-\sqrt[]{5}}{2} α=21+5 β=21−5,则有:
f n = α n − β n 5 f_{n}=\frac{\alpha^n-\beta^n}{\sqrt[]{5}} fn=5αn−βn
用高中学的特征根法可证。
还有亿些性质请读者自行探索。
整除
定义: 如果 a a a , b b b 为整数且 a ≠ 0 a\ne 0 a=0 ,我们说 a a a 整除 b b b 是指存在整数 c c c 使得 b = a c . b=ac. b=ac. 如果 a a a 整除 b b b ,我们还称 a a a 是 b b b 的一个因子,且称 b b b 是 a a a 的倍数.
如果 a a a整除 b b b,记为 a ∣ b a\mid b a∣b ,如果 a a a不能整除 b b b,记为 a ∤ b a\nmid b a∤b
废话
整除的简单性质:
- 如果 a , b , c a,b,c a,b,c 为整数,且 a ∣ b , b ∣ c a\mid b,b\mid c a∣b,b∣c ,则有 a ∣ c a\mid c a∣c.
- 如果 a , b , c , n , m a,b,c,n,m a,b,c,n,m 为整数且 c ∣ a , c ∣ b c\mid a,c\mid b c∣a,c∣b,则有 c ∣ ( n a + m b ) c\mid (na+mb) c∣(na+mb)
给你 n n n 个数 a 1 , a 2 ⋅ ⋅ ⋅ a n a_{1},a_{2}···a_{n} a1,a2⋅⋅⋅an,询问对于每一个 a i a_{i} ai 在数列中有多少数能被 a i a_{i} ai整除。
题解: 本题值域很小,可以根据元素的值建立映射关系,同时统计值域中对于每一个整数的答案,最后输出答案即可。
#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;
}
整除分块
求 ∑ i = 1 n k m o d i \sum_{i=1}^{n}k\ \ mod\ \ i ∑i=1nk mod i.
题解:
显然,
k
m
o
d
i
=
k
−
⌊
k
i
⌋
k\ mod\ i=k-\lfloor \frac{k}{i} \rfloor
k mod i=k−⌊ik⌋
要求的柿子转化为 ∑ i = 1 n ( k − ⌊ k i ⌋ ) = n k − ∑ i = 1 n ⌊ k i ⌋ \sum_{i=1}^{n}(k-\lfloor \frac{k}{i} \rfloor)=nk-\sum_{i=1}^{n}\lfloor \frac{k}{i} \rfloor ∑i=1n(k−⌊ik⌋)=nk−∑i=1n⌊ik⌋
而 ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋ 的不同取值数量小于 2 n 2\ \sqrt[]{n} 2 n 种,理由如下:
将 [ 1 , n ] [\ 1\ ,\ n\ ] [ 1 , n ] 分为两部分 [ 1 , n ] [\ 1\ ,\ \sqrt[]{n}\ ] [ 1 , n ] 和 ( n , n ] (\ \sqrt[]{n}\ ,\ n\ ] ( n , n ].
- 对于 i ∈ [ 1 , n ] i\in [\ 1\ ,\ \sqrt[]{n}\ ] i∈[ 1 , n ] , ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋ 最多有 n \ \sqrt[]{n} n 种取值。
- 对于 i ∈ ( n , n ] i\in (\ \sqrt[]{n}\ ,\ n\ ] i∈( n , n ] , ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋ 值域为 [ 1 , n ) [\ 1\ ,\ \sqrt[]{n}\ ) [ 1 , n ) , 故最多有 n − 1 \ \sqrt[]{n}-1 n−1 种取值。
综上: ⌊ k i ⌋ \lfloor \frac{k}{i} \rfloor ⌊ik⌋ 的不同取值数量小于 2 n 2\ \sqrt[]{n} 2 n 种.
接下来要求出块的左右端点:
结论: 当有
⌊
k
l
⌋
=
⌊
k
r
⌋
\lfloor \frac{k}{l} \rfloor=\lfloor \frac{k}{r} \rfloor
⌊lk⌋=⌊rk⌋ 时,
r
r
r 的最大取值为
⌊
k
⌊
k
l
⌋
⌋
\lfloor \frac{k}{ \lfloor \frac{k}{l} \rfloor} \rfloor
⌊⌊lk⌋k⌋ ,自己证。
之后就可以通过 l , r l,r 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;
}