我真是个垃圾,滚回去刷普及组了
1>快速幂+模运算
#include<cstdio>
#include<cstdlib>
using namespace std;
long long a,b,k;
long long q_pow(long long x,long long y)
{
int i=0;
long long j=x,sum=1;
while(y)
{
if(y&(1<<i))
{
y^=(1<<i);
sum=sum*j%k;
}
i++,j=j*j%k;
}
return sum%k;//注意这里要写mod,因为如果b==0,则不会进入循环
}
int main()
{
scanf("%lld%lld%lld",&a,&b,&k);
printf("%lld^%lld mod %lld=%lld",a,b,k,q_pow(a%k,b));
return 0;
}
我好垃圾啊,水题随便一写就是一小时,难过
2>幂次方
分解成二进制数
#include<cstdio>
#include<cstdlib>
using namespace std;
int n;
int f[20001],lg[20001];
void pre()
{
int i=1,j=0;
while(i<20001)
{
f[i]=j;
i<<=1,j++;
}
for(int i=2;i<20001;i++)
{
lg[i]=lg[i-1];
if(f[i]) lg[i]++;
}
}
void dfs(int x)
{
if(x==1) printf("2(0)");
else if(x==2) printf("2");
else
{
int i=lg[x];
x^=(1<<i);
printf("2");
if(i>1) printf("("),dfs(i),printf(")");
while(x && --i)
if(x&(1<<i))
{
printf("+");
printf("2");
if(i>1) printf("("),dfs(i),printf(")");
x^=(1<<i);
}
if(x) printf("+2(0)");
}
}
int main()
{
scanf("%d",&n);
pre();
dfs(n);
return 0;
}
3>CDQ求逆序对数