1.快速幂
简单来说,就是求a的b次模m。(a<10的9次,b<10的6次,m<10的9次)
按照传统的思想就是a的乘法做b次循环,这种做法的复杂度为O(b),当b的取值变为<10的18次的时候,传统的做法就无法支撑了,于是就有了快速幂的做法,这种基于二分思想的做法。
做法如下。
#include<stdio.h>
#include<math.h>
typedef long long LL;
using namespace std;
int i;
LL binaryPow(LL a,LL b,LL m)
{
if(b==0)
return 1;
if(b&1)
return a*binaryPow(a,b-1,m)%m;
else
{
LL res=binaryPow(a,b/2,m);
return res*res%m;
}
}
int main()
{
LL a,b,m;
while(scanf("%lld%lld%lld",&a,&b,&m)!=EOF)
printf("%lld\n",binaryPow(a,b,m));
return 0;
}
2.活用递归
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=10000;
const int mod=1000000007;
char str[maxn];
int l,i,leftp[maxn],rightt[maxn];
int main()
{
while(gets(str)!=NULL)
{
l=strlen(str);
memset(leftp,0,sizeof(leftp));
memset(rightt,0,sizeof(rightt));
for(i=0;i<l;i++)
{
if(i>0)
leftp[i]=leftp[i-1];
if(str[i]=='P')
leftp[i]++;
}
for(i=l-1;i>=0;i--)
{
if(i<l-1)
rightt[i]=rightt[i+1];
if(str[i]=='T')
rightt[i]++;
}
long long res=0;
for(i=1;i<l;i++)
if(str[i]=='A')
res=(res+leftp[i]*rightt[i])%mod;
printf("%lld\n",res);
}
}
3.4快速排序+归并排序(递归/非递归)
见→https://blog.csdn.net/qq_39782006/article/details/104272238