数学补天 By cellur925

质数

 1 bool prime(int q)
 2 {
 3     if(q==2||q==3) return 1;
 4     if(q==1) return 0;
 5     if(q%6!=1||q%6!=5) return 0;
 6     int cnt=sqrt(q);
 7     for(int i=5;i<=cnt;i+=6)
 8         if(q%2!=0||q%(i+2)!=0) return 0;
 9     return 1;
10 }

 1 //埃氏筛 筛出1~n的素数 
 2 void prime_select()
 3 {
 4     for(int i=2;i<=n;i++)
 5     {
 6         if(vis[i]) continue;
 7         printf("%d\n",i);
 8         for(int j=n;j<=n/i;j++) vis[i*j]=1;
 9     } 
10 } 

线性筛还是要学的qwq(真香),它的原理是每个合数会被它的最小质因子筛一次,利用了当前已经筛出的质数。复杂度真·O(N)

 1 //线性筛
 2 void prime_select()
 3 {
 4     //v[]记录下标数的最小质因子 初值为0 
 5     for(int i=2;i<=n;i++)
 6     {
 7         if(v[i]==0) v[i]=i,prime[++m]=i;
 8         for(int j=1;j<=m;j++)
 9         {//i是比prime[j]更小的质因子or超出n的范围 
10             if(prime[j]>v[i]||prime[j]>n/i) break;
11             v[i*prime[j]]=prime[j];
12         }
13     }
14 }

 1 //质因数分解--基于算术基本定理 复杂度O(根号n)
 2 void divide()
 3 {
 4     for(int i=2;i<=sqrt(n);i++)
 5         if(n%i==0)
 6         {
 7             p[++m]=i;c[m]=0;
 8             while(n%i==0) n/=i,c[m]++;
 9         }
10     if(n>1) p[++m]=n,c[m]=1;
11     for(int i=1;i<=m;i++)
12         printf("%d^%d\n",p[i],c[i]); 
13 } 

丢几个例题跑嘤嘤嘤

例题1 LuoguP1865 A%B Problem ---(本博客开通不久的旧文

   因为数据范围较水,仅1e6,所以我们可以先使用线性筛筛出素数。区间个数用前缀和维护。它珂以当做一个练线性筛的不错模板题。

例题2 UVA10140 Prime Distance  --(题解一篇

   我们知道,任意一个合数x一定包含不超过sqrt(n)的质因子。

   所以我们就筛出2~sqrt(R)之间的所有素数,用他们来标记全部范围内的合数。最后没被标记的数就是质数,比较相邻的质数位置取最大。

例题3 阶乘分解 没有题面,口胡一下。

   把N!分解质因数,按算术基本定理的形式输出。(N为1e6级别)

   N!中质因数p的个数就等于1~N每个数含质因子p的个数之和。其他...详见lyd书p131,不会用LaTex,懒得打了...

   时间复杂度O(Nlogn)

约数

//  这样写书式的复习我肯定干不完...以后会简洁一点...(真香)

  • 基于算术基本定理,N的正约数集合个数为(a1+1)*(a2+1)*(a3+1)*........*(an+1)(基于乘法原理)($a_i$为算术基本定理中的各指数)
  • 求1~N每个数的正约数集合--倍数法
//求1~N每个数的正约数集合--倍数法
void work()
{
    vector<int>fac[500010];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n/i;j++)
            fac[i*j].push_back(i);
}

复杂度为O(N+N/2+N/3+N/4+...+N/N)=O(NlogN)(调和级数)

例题1 LuoguP1463反素数

例题2 LuoguP2261余数之和

  • $gcd(a,b)*lcm(a,b)=a*b$
int gcd(int a,int b)
{
    return b ? gcd(b,a%b) : a;
}//辗转相除
int gcd(int a,int b)
{
    while(a!=b)
    {
        if(a>b)
            a-=b;
        else 
            b-=a;
    }
    return a;
}//更相减损
  • 欧拉函数:1~n中与n互质的数的个数

  • 1~n中与n互质的数的个数为$n*φ(n)/2$
  • 若a,b互质,则φ(a)φ(b)=φ(ab)。
  • 若n为质数,φ(n)=n-1
void phi()
{
    phi[1]=1;
    for(int i=2;i<=n;i++) phi[i]=i;
    for(int i=2;i<=n;i++)
        if(phi[i]==i)
            for(int j=i;j<=n;j+=i)
                phi[j]=phi[j]/i*(i-1);
} 
  • 费马小定理:当p为质数时候, a^(p-1)≡1(mod p)
  • exgcd:https://www.cnblogs.com/nopartyfoucaodong/p/9514767.html

组合数学

  • 求法:https://www.cnblogs.com/nopartyfoucaodong/p/9543206.html
  • 圆排列:https://www.cnblogs.com/nopartyfoucaodong/p/9751569.html
  • 第二类strling数:https://www.cnblogs.com/nopartyfoucaodong/p/9690393.html
  • 卡特兰数:https://www.cnblogs.com/nopartyfoucaodong/p/9752461.html

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9697667.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值