挂了……
没脸发题解……
不过为了督促自己完善这三道题 所以不要脸的来了QAQ
先OTL(orz)各大神 请不喜勿喷&
先发挂了的两个程序……(A 和B) 以后update正确的程序
**
A
**
带权并查集……然而爆零了……
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1001;
int par[maxn],v[maxn];
void ini(int n)
{
for(int i=0;i<=n;i++)
{
par[i]=i;
v[i]=0;
}
}
inline int find(int x)
{
if(par[x]==x)return x;
int p=find(par[x]);
v[x]+=v[par[x]];
par[x]=p;
return par[x];
}
int main()
{
int w;
scanf("%d",&w);
while(w--)
{
int n;
scanf("%d",&n);
ini(n);
int m;
scanf("%d",&m);
bool flag=false;
for(int i=1;i<=m;i++)
{
int a,b,w,p,q;
scanf("%d%d%d",&a,&b,&w);
p=find(a);q=find(b);
if(p==q)
{
if(v[a]-v[b]!=w)flag=1;
}
else
{
par[p]=q;
v[p]=w+v[b]-v[a];
}
}
if(flag)printf("Bessie is blind.\n");
else printf("Bessie's eyes are good.\n");
}
return 0;
}
10.6 A第一次更正……
这是更正之后了的程序……(AC)
我相信你们会机智的发现一丢丢不同……(我不会告诉你们第一句是没有句号的然而我之前加上了……希望各犇不要和我一样……)
**
**
AC Code
**
**
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1001;
int par[maxn],v[maxn];
void ini(int n)
{
for(int i=0;i<=n;i++)
{
par[i]=i;
v[i]=0;
}
}
inline int find(int x)
{
if(par[x]==x)return x;
int p=find(par[x]);
v[x]+=v[par[x]];
par[x]=p;
return par[x];
}
int main()
{
int w;
scanf("%d",&w);
while(w--)
{
int n;
scanf("%d",&n);
ini(n);
int m;
scanf("%d",&m);
bool flag=false;
for(int i=1;i<=m;i++)
{
int a,b,w,p,q;
scanf("%d%d%d",&a,&b,&w);
p=find(a);q=find(b);
if(p==q)
{
if(v[a]-v[b]!=w)flag=1;
}
else
{
par[p]=q;
v[p]=w+v[b]-v[a];
}
}
if(flag)printf("Bessie is blind.\n");
else printf("Bessie's eyes are good\n");
}
return 0;
}
**
B
**
矩阵乘法+快速幂(80分)…………
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
long long k,x,y,p;
void mul(long long a[15][15],long long b[15][15],int n,int m,int k)
{
long long c[11][11];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
long long sum=0;
for(int u=1;u<=m;u++)
{
sum=(sum+a[i][u]*b[u][j])%p;
}
c[i][j]=sum;
}
}
for(int i=1;i<=n;i++)for(int j=1;j<=k;j++)a[i][j]=c[i][j];
}
long long a[15][15],s[15][15];
int main()
{
cin>>k>>x>>y>>p;
for(int i=1;i<=k;i++)
{
scanf("%d",&a[1][i]);
a[i+1][i]=1;
s[i][i]=1;
}
x=x-y+1;
x--;
while(x)
{
if(x&1)mul(s,a,k,k,k);
mul(a,a,k,k,k);
x>>=1;
}
cout<<s[1][1];
return 0;
}
10.6 B第一次更正
OTL LZR
由于爆了 long long 没有思路……在卢神(orz OTL orz OTL)的指导下加入了快速乘 加入x
#define orz OTL LZR
**
AC Code
**
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
long long q_mul( long long a, long long b, long long mod ) //快速计算 (a*b) % mod
{
long long ans = 0; // 初始化
while(b) //根据b的每一位看加不加当前a
{
if(b & 1) //如果当前位为1
{
b--;
ans =(ans+ a)%mod; //ans+=a
}
b /= 2; //b向前移位
a = (a + a) % mod; //更新a
}
return ans;
}
long long k,x,y,p;
void mul(long long a[15][15],long long b[15][15],int n,int m,int k)
{
long long c[11][11];
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=k;j++)
{
long long sum=0;
for(long long u=1;u<=m;u++)
{
sum=(sum+q_mul(a[i][u],b[u][j],p))%p;
}
c[i][j]=sum;
}
}
for(long long i=1;i<=n;i++)for(long long j=1;j<=k;j++)a[i][j]=c[i][j];
}
long long a[15][15],s[15][15];
int main()
{
cin>>k>>x>>y>>p;
if(x<y)
{
printf("0");
return 0;
}
for(long long i=1;i<=k;i++)
{
cin>>a[1][i];
a[i+1][i]=1;
s[i][i]=1;
}
x=x-y+1;
x--;
while(x)
{
if(x&1)mul(s,a,k,k,k);
mul(a,a,k,k,k);
x>>=1;
}
cout<<s[1][1];
return 0;
}
——既然选择了远方,便只顾风雨兼程