键盘侠牧师
你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。
今天看了一个前辈的模板挺好的 借鉴一下:https://blog.csdn.net/f_zyj/article/details/51594851
https://blog.csdn.net/weixin_43093481/article/details/82229718

1
.试除法判质数 bool is_prime(int n) { if(n<2)return false; for(int i=2;i<=sqrt(n);i++) if(ni==0)return flase; return true; } 2.埃式筛 void prime(int n) { memset(v,0,sizeof(v); for(int i=2;i<=n;i++) { if(!v[i])prime[++m]=i; for(int j=1;j<=n/i;j++) { v[i*j]=1; } } } 3.线性筛法 const ll N = 1000000; ll v[N],prime[N]; int inint(int n) { int m=0; for(int i=2;i<=n;i++) { if(!v[i]) { v[i]=i; prime[++m]=i; } forint j=1;j<=m;j++) { if(prime[j]>n/I||prime[j]>v[i])break; v[i*prime[j]]=prime[j]; } } } 4.试除法质因数分解 void divid(int n) { m = 0; for(int i=2;i< = sqrt(n);i++) { if(n%i) { p[++m]=i,c[m]=0; while(n%i==0) { n/=i; c[m]++; } } } if(n>1) p[++m]=n, c[m]=1; for(int i=1;i<=m;i++) cout <<p[i]<<" "<<c[i]<<endl; } 5.求1~N每个数的正约数集合—————倍数法 vector<int>factor[500010]; int n; cin >>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n/i;j++) factor[i*j].push_back(i); } for(int i=1;i<=n;i++) { for(intj=0;j<factor[i].size();j++) printf("%d ",factor[i][j]); puts(" "); }

6.更相减损术

适合于较大的数求最大公约数

若a>b:

gcd(a,b) = gcd(b,a-b) = gcd(a,a-b)

gcd(2a,2b) = 2gcd(a,b)

7.欧几里得算法

int gcd(int a,int b)
{
if (a < b)
swap(a, b);
return b == 0 ? a : gcd(b, a % b);
}

 


9.欧拉函数
单个欧拉函数代码:
long long Euler( long long n ){


long long res = n;
for( long long i =2 ;i*i<=n;i++){


if( n %i == 0 ){
n/=i;
res = res - res/i;
}


while( n % i==0)
n/=i;


}
if( n > 1 )
res = res - res/n;
return res;
}
欧拉函数筛法:


for(int i=2;i<=N;i++)
euler[i]=i;
for(int i=2;i<=N;i++)
if(euler[i]==i)
for(int j=i;j<=n;j+=i)
euler[j]=euler[j]/i*(i-1);



10.扩展欧几里得


void gcd(int a,int b,int &d,int &x,int &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
gcd(b,a%b,d,y,x);
y -=x*(a/b);
}
}


11.裴蜀定理(或贝祖定理,Bézout's identity)
若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1.


12.

乘法逆元

 

看到一篇博客写的特别好,这里推荐一下

https://blog.csdn.net/zhjchengfeng5/article/details/7786595
什么叫乘法逆元?


a*x = 1(mod m)


这里,我们称 x 是 a 关于 m 的乘法逆元
这怎么求?可以等价于这样的表达式: a*x + m*y = 1


看出什么来了吗?没错,当gcd(a , m) != 1 的时候是没有解的这也是 a*x + b*y = c 有解的充要条件: c % gcd(a , b) == 0



 


 


 



 

posted on 2019-08-19 19:02  键盘侠牧师  阅读(141)  评论(0编辑  收藏  举报