poj 3233 矩阵快速幂+二分求解
题目传送门
//矩阵快速幂+二分
#include
#include
#include
using namespace std;
const int maxn=30+5;
typedef struct{
int mar[maxn][maxn];
}MATRAX;
MATRAX a,per; //初始矩阵 单位矩阵
int n,m;
void init()
{
memset(per.mar,0,sizeof(per.mar));
for(int i=0;i>=1;
}
return ans;
}
MATRAX MatraxSum(int k)
{
if(k==1) return a;
MATRAX temp,b;
temp=MatraxSum(k/2);
if(k&1) {
b=pow_mod(k/2);
temp=add(temp,multi(temp,b));
temp=add(temp,pow_mod(k));
}
else {
b=pow_mod(k/2);
temp=add(temp,multi(temp,b));
}
return temp;
}
int main()
{
int k;
while(scanf("%d%d%d",&n,&k,&m)==3)
{
init();
MATRAX solve;
solve=MatraxSum(k);
for(int i=0;i
poj 1995 快速幂
题目传送门
//矩阵快速幂
#include
#include
using namespace std;
typedef long long LL;
LL pow_mod(LL a,LL b,LL MOD)
{
LL res=1;
while(b)
{
if(b&1) res=res*a%MOD;
a=a*a%MOD;
b>>=1;
}
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL M,ans=0;
scanf("%lld",&M);
int k;
scanf("%d",&k);
for(int i=0;i
poj 1006 中国剩余定理 特殊的有规律的线性同余方程组
题目传送门
//中国剩余定理
#include
#include
using namespace std;
typedef long long LL;
void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
d=a;
x=1;
y=0;
return;
}
else {
ex_gcd(b,a%b,d,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
}
}
int main()
{
int kase=0;
LL p,e,i,d;
while(scanf("%lld%lld%lld%lld",&p,&e,&i,&d)==4)
{
if(p==-1&&e==-1&&i==-1&&d==-1) break;
LL ans=0,f,x,y,M=23*28*33;
ex_gcd(28*33,23,f,x,y);
ans=(ans+28*33*x*p)%M;
ex_gcd(23*33,28,f,x,y);
ans=(ans+23*33*x*e)%M;
ex_gcd(23*28,33,f,x,y);
ans=(ans+23*28*x*i)%M;
ans=ans-d;
if(ans<=0) ans+=M;
printf("Case %d: the next triple peak occurs in %lld days.\n",++kase,ans);
}
return 0;
}
hdu 1788 两种解法
题目传送门
1.找到了一定的规律,发现只需要求出这些数的最小公倍数,再减a即可
//中国剩余定理
#include
#include
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
LL n,a;
while(scanf("%lld%lld",&n,&a)==2)
{
if(n==0&&a==0) break;
LL M=1;
for(int i=0;i
2.求解线性同余方程组
//求解线性同余方程组
#include
#include
using namespace std;
typedef long long LL;
void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
d=a;
x=1;
y=0;
return;
}
else {
ex_gcd(b,a%b,d,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
}
}
int main()
{
LL n,a;
while(scanf("%lld%lld",&n,&a)==2)
{
if(n==0&&a==0) break;
LL r,k;
scanf("%lld",&k);
r=k-a;
for(int i=0;i