标签:不同的 一个 log 成功 快速 意义 进制 节点 无向图
分析题目,发现c可以转化为a*b^-1
一、费马小定理(【参考程序一】):
对于本题而言,a为整数,且除数为质数(p=19260817),因此可以使用费马小定理,即a^(p-1)≡1(mod p)
,然后得出
c=a*b^(-1)=a*b^(p-2)(mod p)
,接下来用快速幂求即可
特别的,当b=0时,即分母为0,因此无解。
本算法的优势是较容易写,但除数必须是质数,因而通用性不强。
二、扩展欧几里得(【参考程序二】)
解析题目发现:本题就是求b在mod p的意义下的逆元。
求a的逆元相当于求解ax=1(mod p)
,这个方程可以转化为ax-my=1
,然后直接套用扩欧求解x,y。
特别的,当gcd(a,p)≠1 gcd(a,p)≠1
时,方程无解,因此a也无逆元。
a、b都很大,不能直接存。
因为(a+P)^k==a^k(mod P)
以及(a+P)*b==a*b(mod P)
快读时把a、b都对P取模即可。
rep(i,1,n)rd(f[i][0]);
rep(j,0,20)
for(int i=1;i+(1<<j)-1<=n;++i)
f[i][j+1]=max(f[i][j],f[i+(1<<j)][j]);
while(m--){
int l,r;rd(l),rd(r);
int len=log2(r-l+1);
printf("%d\n",max(f[l][len],f[r-(1<<len)+1][len]));
}
*如果图中奇数度的顶点个数小于等于2,则一定存在欧拉回路
*在无向图中每个顶点的度都是偶数,则一定存在回路
*在有向图中,每个节点的入度等于出度,则存在回路
使用并查集维护经过点的个数
设hebing为成功合并的次数,n为点数
则整张图含欧拉路当且仅当hebing>=n-1且奇度数点为0或2
//tot:出现的点的个数(把一种颜色看做一个点)
//hebing记录成功合并的次数
s[i]-‘A‘+10
和b[i]+‘A‘-10
的应用
rd(n);cin>>s;rd(m);
int len=s.length();
rep(i,1,len){
if(isalpha(s[i-1]))a[i]=s[i-1]-'A'+10;
else if(isdigit(s[i-1]))a[i]=s[i-1]-'0';
}
int quan=1;//n进制转10进制
dwn(i,len,1){
sum+=a[i]*quan;
quan*=n;
}
int wei=0;//用取模法把10进制转成m进制
for(int len=1;sum;sum/=m,len++){
b[len]=sum%m;
wei++;
}
dwn(i,wei,1){//注意倒序,结合2进制思考
if(b[i]>=10)printf("%c",b[i]+'A'-10);
else printf("%d",b[i]);
}
表示n个球放入r个不同的盒子的方法。
状态设定:设
f[i][j]
表示前i个球放入j个盒子的方法
答案表示:
f[n][r]* fac[r]
(最后的最后,由于是r个不同的盒子,所以要×*r!
)
状态转移:f初始化为1,
f[i][j]=f[i-1][j-1]+j*f[i-1][j]
1.考虑第i个球不放入j-1个盒子,而是新开一个盒子(f[i-1][j-1]前i-1个已经放好在了前j-1个盒子,第i个放入新的j号盒子)
2.考虑第i个球放入已经选好的j个盒子.(
j* f[i-1][j]
前i-1个已经放好在了前j个盒子,第i个放入选好的前j号盒子的任意一个,所以要* j)
标签:不同的 一个 log 成功 快速 意义 进制 节点 无向图
原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634661.html