Algorithm9.1 数论 数学基础

[TOC]

数论 数学基础

常用:

  • 进制转换

数学思维:

1、找到一段序列中出现奇数次/偶数次的

2、找到一段区间中可以用平方差计算得到的个数

进制转换

获取唯一的奇数个的不匹配的数 & 找未配上的对

https://www.luogu.com.cn/problem/P1469 【注意:卡内存,卡时间】

  • 思路一:数组存,然后排序,然后再遍历,两个两个遍历=> 爆内存,爆时间。
  • 思路二:map存,找到配对的删除。一边即过。=> 6个点爆内存
  • 正确思路:直接用一个变量,然后来异或^所有的数,a^a = 0,所以最后剩下的那个数就是没匹配的。
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {scanf("%d", &t); ans ^= t;}
printf("%d\n", ans);    

获取唯一的出现偶数次数的 & 找配上对的

这个需要先把所有存在的数都输入进去,得到所有数的异或,然后再异或数组种的所有数,那么出现偶数次的就会显露出来了,出现单次的就会和第一次的异或掉了。

scanf("%d", &n);
for (int i = 1; i <= n; ++i) {scanf("%d", &t);ans^=t;}
scanf("%d", &m);
for (int i = 1; i <= m; ++i) {scanf("%d", &t);ans^=t;}

区间中可以用平方差计算得到的个数

https://www.luogu.com.cn/problem/P1348

题目大意:区间[a, b]中,某个数i,这个数i可以写成c^2-d^2

正向数学推导:i=(c+d)(c-d),那么c+d/c-d必定为同奇偶,同奇偶必定乘积要不满足是奇数,要不满足是4的倍数(因为是两个2的倍数相乘)。

反推验证:若i为奇数,也就是2k+1,那么可以找到c=k+1, d=k满足c+d=2k+1与c-d=1的乘积为2k+1这个条件。

若i为4的倍数,也就是4k,那么可以找到c=k+1, d=k-1满足c+d=2k与c-d=2的乘积是4k这个条件。

for (int i = a; i <= b; ++i)
    if (i%2 || !(i%4)) ans++;
Posted on Feb 1, 2021