寒假培训——快速幂取模
每个题目都有超链接,点击可以跳转到题目界面!!!
快速幂取模
1.号的优先级要比%的优先级高,所以(ab)%m与ab%m相同。
2.(aaaa)%m=(a^2 a^2)%m=(a ^2%m a^2%m)%m=(a%ma%ma%ma%m)%m;
3.只要是快速幂取模,就简单地将每一项和总和后面加%mod即可。
4.a%m%m=a%m;
5.(a+b)%m=(a%m+b%m)%m
6.(ab)%m=(a%m*b%m)%m
库特的数学题
多写几项就会发现a[n]=2*pow(3,n),再代入快速幂取模的模板即可。
如果就是单纯按照题目的关系式来做就会超时
异或方程解的个数
先移项:a=x+(a^x),然后看二进制数的某一位,讨论即可发现规律:
a x+(a^x)
1 0+(1^0)=1
1 1+(1^1)=1
0 0+(0^0)=0
0 1+(0^1)=10
可以发现,第四种情况(a=0,x=1)会改变产生进位,改变了a的值,所以排除第四种情况。
综合第三,四种情况,可以发现,如果a的某一位为0的话,那么x对应位只能为0。
再来看第一,第二种情况,我们发现,当a的某一位为1时,x的对应位可以为1,可以为0。
所以,我们只需求出a的二进制数中,有多少个1即可,答案即为2^n
注:
1.二进制的加法是满2进1,如100110+110010=1011000;
2.一个数每除以一次2,其二进制的最后一位就会消掉;
3.a=a<<1相当于将a乘以2,左移的速度要比乘法快。
本题不用快速幂取模
注:
pow(a,b)函数中的a和b可以是long long类型的数,但是其返回的是int类型的,所以用%lld输出会是随机值,所以应该对pow(a,b)进行强制类型转换,再输出。
printf("%lld\n",(long long int)pow(2,num1));