这一周要开始看题了,然鹅我还没看完数论,还差点概率和博弈论……难过,又要抽时间补惹嘤嘤嘤。
今天打算看大佬博客里面2015年以及之前的看完hhh.
看见了一个米勒素数测试,没有学过,作用是判断一个数是不是素数,但是这个数太大导致o(√n)都没有办法通过时间限制,所以才有这个算法。这个算法判断素数只能是大概率成功,小概率还是判断不出来的……然后我并不能看懂什么鬼东西,感觉我这个水平也用不到……
发现gcd是啥都记不住了……看了个题目标着gcd,还要去查查gcd什么鬼。
好题1:hdoj 5505 GT and numbers
坑点:2^63次方long long也爆,所以只能用unsigned long long。n要想乘上n的因子变成m,最好的办法是n/m是n的因子啦
顺便说一句啊,老师发的那个某个人的博客啊,题目没复制全……我还要搜。。
拓展欧几里得:hdoj 2669 Romantic
用一个公式隐晦的表达出是要考这个,也不算太隐晦,能读出是我学的某个定理。坑点2^31,o(n)就超时,必须用算法。
m不两两互质的中国剩余定理,
例题:pku2891 Strange Way to Express Integers
因为一直记不住,理解也理解不了,还是记下来吧,理解不了死记硬背,我觉得虽然学习方法有点毛病,但是……咱也没办法是吧。
///n个mi不互质
const LL maxn = 1000;
LL a[maxn], m[maxn], n;
LL CRT(LL a[], LL m[], LL n) {
if (n == 1) {
if (m[0] > a[0]) return a[0];
else return -1;
}
LL x, y, d;
for (int i = 1; i < n; i++) {
if (m[i] <= a[i]) return -1;
d = ex_gcd(m[0], m[i], x, y);
if ((a[i] - a[0]) % d != 0) return -1; //不能整除则无解
LL t = m[i] / d;
x = ((a[i] - a[0]) / d * x % t + t) % t; //第0个与第i个模线性方程的特解
a[0] = x * m[0] + a[0];
m[0] = m[0] * m[i] / d;
a[0] = (a[0] % m[0] + m[0]) % m[0];
}
return a[0];
}
看的好烦啊,我是真的看不懂那些连一个注释都没有的垃圾代码,烦死了烦死啦!!看不进去!就算看也只是能看懂题解而已,,,没有学下去的信心和希望了。。。该怎么办呢,,不该这样放弃的
再加油看看吧……反正都痛苦了这么久了!!
POJ 1284 Primitive Roots
用了一个原根什么的,仔细一看就是欧拉函数,但是求欧拉函数的方法与我知道的不一样啊!!看的我一愣一愣的,后来找了博客才知道了欧拉函数的第二种求法~
一开始学的第一种,求质因子,再带公式,用的试除??比较好理解,第二种利用了筛法。
const int maxn = 1000+10;
int phi[maxn];
void selEuler(int n, int* phi)
{
for(int i = 2; i <= n; i++)
phi[i] = 0;
phi[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!phi[i])
{
for(int j = i; j <= n; j += i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
}
}
然后啊,就发现了很多别的课本上什么都没有的知识点!!这就是把书读厚的第一步吗!不过我觉得学的确实有点急,我比较想找一些数论的水题,然后一层一层的做下去,加深对知识点的理解的,别人的题终究是别人的题,别人不会的我确实不会,但是别人会的我还真不一定会(我觉得很大概率不会),一直看这种题目,给我一种,基础一点点都没有的感觉。。。也就那点记在脑子里面的模板算是一点点基础吧。
鼠标好难用……
pku2739 Sum of Consecutive Prime Numbers
符合我水平的水题*1,好就好在这种解题思路很常见,但是我一直记不住。枚举最小的素数,然后一个个加。嗯,不想刷题,就酱紫吧,反正就是打个素数的表一个个枚举呗。
素数的表可以用那个很接近线性的倍增法,也不超时,很棒。
pku3126 prime path
这个题我觉得很棒!!每次换一个数字桨素数a变成素数b,变后的数字也要是素数哦。(有种奇妙的既视感什么鬼!)像这种素数打表顺便bfs的人家就是不会bfs啦讨厌~严格来说这应该是个bfs的题目啦(第一眼看见bfs以为是深搜。。。尴尬)。仔细一想,是个垃圾的水题。。。。就是细节处理有点麻烦,咳咳咳!哭了,再也不录入这种题了啦!
pku2689 prime distance
求区间里面素数距离最大跟最小时的素数,因为好像有很强烈的既视感,就想记录下来~
坑点*在于,打表,l与r的r太大了(=2,147,483,647),打不了那么大的表,电脑之内跑到2^29内的素数,很难办(看题解的时候,博客园里面大佬的博客好漂亮啊!!!爱了!!!)题解里面说,根据小的素数去筛后面的区间~呜,其实并不会,看不懂,不明不白的用了2^31开方。
好像明白了,就是用小的素数而已,大的到后面用小的表示,相当于,总的素数表分成两段来打?
for (long long i = 0; i < pcnt; i++)//小段内的素数个数循环
for(long long j=((l+primek[i]-1)/primek[i])*primek[i];j<=r;j+=primek[i])
if(j / primek[i] != 1)//primek[i]是大区间里面这个数的因子
vis[j - l] = 1;//这个数就不再是素数
这里的找区间的思想是,遍历一遍,找个指针指向左端点,另外的i是右端点,然后一个个比较。
我发现,求素数,最多的时候,就是用那个函数打表,,,一般都是这样的,以后也还是尽量不用判断素数那个东东了吧
今天做了很多质数的题目,还有最大公约数的题目,还有点欧拉函数的,明天看素数的比较难的题吧……今天看的都比较简单咳咳咳(挑的简单的,男的我都看不懂。。。要哭了。
相对而言,欧拉函数的题,最难,明天攻克欧拉函数!!还有素数里面比较难滴~一节一节的学,,符合我个人的学习习惯,主要是吧,,后面的要结合前面的知识,前面搞不懂很难受。查缺补漏也不能这样补啊。。。这都跟个渔网似的了。
今天印象深刻的是这几个晚上看的题目咳咳咳。。还有一个n乘上因子变成m的题目!
我说的好题,应该是相当于一种感觉是我这个阶段,有那么一丝丝可能ac的难度中等及以上的题目吧!(对我这种菜鸡来说)