qbxt十一系列四

关于考试:题目很难,T1和T3都失误,爆零orz

qbxt十一系列四

qbxt十一系列四

更正:第三组:不存在相同的字符|str|=26,26<=n<=100

【题目分析】

第一反应,组合数学;第二反应,有端倪;jn给了一道题GT考试 很多大神都做过,kmp+矩阵乘法

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+;
const int mod=1e9+;
int n,cnt,len;
char str[N],pat[N];
ll f[N];
void dfs(int now){
if(now==n){
if(++cnt>=mod) cnt%=mod;
return ;
}
bool flag=(now<len-)|(!equal(str+now-len+,str+now,pat));
for(char x='a';x<='z';x++){
if(!flag&&x==pat[len-]) continue;
str[now]=x;
dfs(now+);
}
}
ll fpow(ll a,ll p){
ll res=;
for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
return res;
}
int main(){
freopen("helloworld.in","r",stdin);
freopen("helloworld.out","w",stdout);
while(scanf("%d",&n)==){
scanf("%s",pat);
len=strlen(pat);
cnt=;
if(!n){puts("");continue;}
if(n<=){
dfs();
printf("%d\n",cnt);
}
else if(len==){
printf("%d\n",fpow(,n));
}
else{
f[]=;
for(int i=;i<=len;i++) f[i]=f[i-]*%mod;
for(int i=len;i<=n;i++) f[i]=(f[i-]*-f[i-len]+mod)%mod;
printf("%d\n",(int)f[n]);
}
}
return ;
}

qbxt十一系列四

更正:输出的顺序保证a<b

qbxt十一系列四

更正:输出样例:0 1000000006

【题目分析】

矩阵乘法斐波那契数列变形

#include<cstdio>
#include<cstring>
#include<iostream>
#ifdef unix
#define LL "%lld"
#else
#define LL "%I64d"
#endif
using namespace std;
#define ll long long
#define N 3
const ll mod=1e9+;
ll a[N][N],b[N][N],c[N][N];
ll p,q,a1,a2,n;
inline const ll read(){
register ll x=,f=;
register char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void work(){
a[][]=;a[][]=q;a[][]=;a[][]=p;
b[][]=;b[][]=q;b[][]=;b[][]=p;
while(n){
if(n&){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mod)%mod;
}
}
}
memcpy(a,c,sizeof c);
memset(c,,sizeof c);
}
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
c[i][j]=(c[i][j]+b[i][k]*b[k][j]%mod)%mod;
}
}
}
memcpy(b,c,sizeof c);
memset(c,,sizeof c);
n>>=;
}
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
p=;q=;a1=;a2=;
n=read();ll bf=n;
if(n==){printf("1 1");return ;}
if(n%mod==){printf("1 ");printf(LL,n-);return ;}
n-=;
work();
ll ans1=(a[][]%mod+a[][]%mod)%mod;
n=bf;
work();
ll ans2=(a[][]%mod+a[][]%mod)%mod;
if(ans1>ans2) swap(ans1,ans2);
printf(LL,ans1);putchar(' ');printf(LL,ans2);
return ;
}

qbxt十一系列四

更正:模数1000000007

qbxt十一系列四

【题目分析】

开始打了匈牙利算法,自我感觉p==1的情况还是可以混过去的吧,结果爆零啦

考完据shenben和ylf说并不是匈牙利算法!!是树形DP!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 100010
#define mod 1000000007
#define ll long long
using namespace std;
ll T,P,n,head[maxn],num,f[maxn][],g[maxn][],L,R[maxn],l,r[maxn],son[maxn];
struct node{
ll v,pre;
}e[maxn*];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(ll from,ll to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Clear(){
num=;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
memset(head,,sizeof(head));
}
void DP(ll now,ll from){
g[now][]=;
ll mx,sum;
for(int i=head[now];i;i=e[i].pre){
ll v=e[i].v;
if(v==from)continue;
DP(v,now);//x不连儿子 儿子们可连可不连
mx=max(f[v][],f[v][]);sum=;
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
g[now][]=g[now][]*sum%mod;
f[now][]+=mx;
}
//x连某个儿子 这个不选 其他的连或者不连
L=;l=;ll S=;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)son[++S]=e[i].v;
R[S+]=;r[S+]=;
for(int i=S;i>=;i--){
ll v=son[i];sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
R[i]=R[i+]+mx;
r[i]=r[i+]*sum%mod;
}
for(int i=;i<=S;i++){
ll v=son[i];
mx=L+f[v][]+R[i+]+;
if(mx>f[now][]){
f[now][]=mx;
g[now][]=l*g[v][]%mod*r[i+]%mod;
}
else if(mx==f[now][])
g[now][]=(g[now][]+l*g[v][]%mod*r[i+]%mod)%mod;
sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
l=l*sum%mod;L+=mx;
}
}
int main()
{
freopen("hungary.in","r",stdin);
freopen("hungary.out","w",stdout);
T=init();P=init();
while(T--){
n=init();
ll u,v;Clear();
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
DP(,);ll sum,mx;
mx=max(f[][],f[][]);sum=;
if(mx==f[][])sum+=g[][],sum%=mod;
if(mx==f[][])sum+=g[][],sum%=mod;
if(P==)cout<<mx<<endl;
if(P==)cout<<mx<<" "<<sum<<endl;
}
return ;
}

qbxt十一系列四

qbxt十一系列四

【题目分析】

不会

#include<cstdio>
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
inline int max(int a,int b){return a>b?a:b;}
inline const int read(){
register int x=,f=;
register char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int f[N][N];
int main(){
freopen("radius.in","r",stdin);
freopen("radius.out","w",stdout);
n=read();m=read();
for(int i=;i<=n;i++) for(int j=;j<=n;j++) f[i][j]=inf;
for(int i=,x,y,z;i<=m;i++){
x=read();y=read();z=read();
if(f[x][y]>z) f[y][x]=f[x][y]=z;
}
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i!=j&&j!=k&&i!=k){
if(f[i][j]>f[i][k]+f[k][j]){
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
}
int d=;
for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
if(f[i][j]!=inf) d=max(d,f[i][j]);
}
}
double ans=d/2.0;
printf("%.2lf",ans);
return ;
}
上一篇:linux内核 container_ofC语言之应用


下一篇:The Same Game(模拟)