qbxt十一系列四

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

更正:第三组:不存在相同的字符|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+7;
const int mod=1e9+7;
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-1)|(!equal(str+now-len+1,str+now,pat));
    for(char x=‘a‘;x<=‘z‘;x++){
        if(!flag&&x==pat[len-1]) continue;
        str[now]=x;
        dfs(now+1);
    }
}
ll fpow(ll a,ll p){
    ll res=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
    return res;
}
int main(){
    freopen("helloworld.in","r",stdin);
    freopen("helloworld.out","w",stdout);
    while(scanf("%d",&n)==1){
        scanf("%s",pat);
        len=strlen(pat);
        cnt=0;
        if(!n){puts("0");continue;}
        if(n<=5){
            dfs(0);
            printf("%d\n",cnt);
        }
        else if(len==1){
            printf("%d\n",fpow(25,n));
        }
        else{
            f[0]=1;
            for(int i=1;i<=len;i++) f[i]=f[i-1]*26%mod;
            for(int i=len;i<=n;i++) f[i]=(f[i-1]*26-f[i-len]+mod)%mod;
            printf("%d\n",(int)f[n]);
        }
    }
    return 0;
}

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

更正:输出样例: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+7;
ll a[N][N],b[N][N],c[N][N];
ll p,q,a1,a2,n;
inline const ll read(){
    register ll x=0,f=1;
    register char ch=getchar();
    while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
void work(){
    a[1][1]=0;a[1][2]=q;a[2][1]=1;a[2][2]=p;
    b[1][1]=0;b[1][2]=q;b[2][1]=1;b[2][2]=p;
    while(n){
        if(n&1){
            for(int i=1;i<=2;i++){
                for(int j=1;j<=2;j++){
                    for(int k=1;k<=2;k++){
                        c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mod)%mod;
                    }
                }
            }
            memcpy(a,c,sizeof c);
            memset(c,0,sizeof c);
        }
        for(int i=1;i<=2;i++){
            for(int j=1;j<=2;j++){
                for(int k=1;k<=2;k++){
                    c[i][j]=(c[i][j]+b[i][k]*b[k][j]%mod)%mod;
                }
            }
        }
        memcpy(b,c,sizeof c);
        memset(c,0,sizeof c);
        n>>=1;
    }
}
int main(){
    freopen("gcd.in","r",stdin);
    freopen("gcd.out","w",stdout);
    p=1;q=1;a1=1;a2=2;
    n=read();ll bf=n;
    if(n==1){printf("1 1");return 0;}
    if(n%mod==0){printf("1 ");printf(LL,n-1);return 0;}
    n-=1;
    work();
    ll ans1=(a[1][1]%mod+a[2][1]%mod)%mod;
    n=bf;
    work();
    ll ans2=(a[1][1]%mod+a[2][1]%mod)%mod;
    if(ans1>ans2) swap(ans1,ans2);
    printf(LL,ans1);putchar(‘ ‘);printf(LL,ans2);
    return 0;
}

更正:模数1000000007

【题目分析】

开始打了匈牙利算法,自我感觉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][2],g[maxn][2],L,R[maxn],l,r[maxn],son[maxn];
struct node{
    ll v,pre;
}e[maxn*2];
ll init(){
    ll x=0,f=1;char s=getchar();
    while(s<‘0‘||s>‘9‘){if(s==‘0‘)f=-1;s=getchar();}
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;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=0;
    memset(f,0,sizeof(f));
    memset(g,0,sizeof(g));
    memset(head,0,sizeof(head));
}
void DP(ll now,ll from){
    g[now][0]=1;
    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][1],f[v][0]);sum=0;
        if(mx==f[v][1])sum+=g[v][1];
        if(mx==f[v][0])sum+=g[v][0];
        g[now][0]=g[now][0]*sum%mod;
        f[now][0]+=mx;
    }
    //x连某个儿子 这个不选 其他的连或者不连
    L=0;l=1;ll S=0;
    for(int i=head[now];i;i=e[i].pre)
        if(e[i].v!=from)son[++S]=e[i].v;
    R[S+1]=0;r[S+1]=1;
    for(int i=S;i>=1;i--){
        ll v=son[i];sum=0;
        mx=max(f[v][1],f[v][0]);
        if(mx==f[v][1])sum+=g[v][1];
        if(mx==f[v][0])sum+=g[v][0];
        R[i]=R[i+1]+mx;
        r[i]=r[i+1]*sum%mod;
    }
    for(int i=1;i<=S;i++){
        ll v=son[i];
        mx=L+f[v][0]+R[i+1]+1;
        if(mx>f[now][1]){
            f[now][1]=mx;
            g[now][1]=l*g[v][0]%mod*r[i+1]%mod;
        }
        else if(mx==f[now][1])
            g[now][1]=(g[now][1]+l*g[v][0]%mod*r[i+1]%mod)%mod;
        sum=0;
        mx=max(f[v][1],f[v][0]);
        if(mx==f[v][1])sum+=g[v][1];
        if(mx==f[v][0])sum+=g[v][0];
        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=1;i<n;i++){
            u=init();v=init();
            Add(u,v);Add(v,u);
        }
        DP(1,0);ll sum,mx;
        mx=max(f[1][0],f[1][1]);sum=0;
        if(mx==f[1][0])sum+=g[1][0],sum%=mod;
        if(mx==f[1][1])sum+=g[1][1],sum%=mod;
        if(P==1)cout<<mx<<endl;
        if(P==2)cout<<mx<<" "<<sum<<endl;
    }
    return 0;
}

【题目分析】

不会

#include<cstdio>
using namespace std;
const int N=205;
const int inf=0x3f3f3f3f;
inline int max(int a,int b){return a>b?a:b;}
inline const int read(){
    register int x=0,f=1;
    register char ch=getchar();
    while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;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=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=inf;
    for(int i=1,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=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;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=0;
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            if(f[i][j]!=inf) d=max(d,f[i][j]);
        }
    }
    double ans=d/2.0;
    printf("%.2lf",ans);
    return 0;
}
时间: 2024-10-08 20:50:25

qbxt十一系列四的相关文章

qbxt十一系列一

希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“前进栈”,从“后退栈”中取出栈顶页面,并设置为当前页面.FORWARD: 如果“前进栈”为空则忽略此命令.否则将当前两面压入“后退栈”,从“前进栈”中取出栈顶页面,并设置为当前页面.VISIT: 将当前页面压入“后退栈”. 并将当前页面置为指定页面, 并将“前进栈”置空.QUIT: 退出.假设此浏览

qbxt十一系列三

[题目分析] 这完全是个数学题啊,有些崩溃,上午考试写了两个小时,20分,于是乎 下午改啊改啊 改到10分....如果第二个圆的圆心在第一个圆.....呃 说不清楚 像下面这个图这样,两圆重叠部分中C2对应的扇形对应的圆心角(有些绕)是超过180的,所以我们先算这个角的一半再乘以2防止出现负数,然后求三角形面积的时候不要用海伦公式,如果你想用考虑考虑后果(还是会出现负数hh),好了这样我的AC道路就走了一半了,可以60(真相还在后面).我是多么迫切的想要AC,于是乎开始找错误找错误....发现在

qbxt十一系列二

PA[题目描述]汉诺塔升级了:现在我们有N个圆盘和N个柱子,每个圆盘大小都不一样,大的圆盘不能放在小的圆盘上面,N个柱子从左到右排成一排.每次你可以将一个柱子上的最上面的圆盘移动到右边或者左边的柱子上 (如果移动之后是合法的话) . 现在告诉你初始时的状态, 你希望用最少的步数将第i小的盘子移动到第i根柱子上,问最小步数.[输入格式]第一行一个正整数T,代表询问的组数.接下来T组数据,每组数据第一行一个整数N.接下来一行每行N个正整数,代表每个柱子上圆盘的大小.[输出格式]输出共N行,代表每次的

Exchange 2013SP1和O365混合部署系列四

前面的三篇算是准备工作,今天我们看下如何在Exchange 2013 SP1中配置启用混合部署.老规矩,先看图,特别注意的我会,指出. 在EAC面板有个混合选项.点击启用.然后会登录到0365. 继续下一步. 继续下一步. 继续下一步. 远程迁移需要一张公网的证书. 继续下一步,需要输入凭据. 下面会自动开始配置. 混合部署到这里,算是配置完成. 组织里面多了本地到O365的通道. O365里面则相反的. 下篇我们将介绍本地新建O365账号和本地到O365的迁移. 先到这里. Exchange

ICMP拒绝服务攻击(原始套接字系列四)

拒绝服务攻击(DoS)企图通过使被攻击的计算机资源消耗殆尽从而不能再提供服务,拒绝服务攻击是最容易实施的攻击行为.中美黑客大战中的中国黑客一般对美进行的就是拒绝服务攻击,其技术手段大多不够高明. ICMP实现拒绝服务攻击的途径有二:一者"单刀直入",一者"借刀杀人".具体过程分析如下:   ICMPFLOOD攻击 大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应.中美黑客大战中的多数中国黑客采用的正是此项技术.ICMP FLOOD攻击实际上是

Lync Server 2010 安装部署系列四:安装&配置证书服务器

1.打开"服务器管理器" 2.添加角色 3.单击下一步按钮 4.勾选"Active Directory证书服务" 5.单击"下一步"按钮: 6.勾选"证书颁发机构"和"证书颁发机构Web注册",单击"下一步"按钮: 7.勾选"企业",单击"下一步"按钮: 8.勾选"根CA",单击"下一步"按钮: 9.勾选&q

sed修炼系列(四):sed中的疑难杂症

本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N"的纠葛 1.sed中使用变量和变量替换的问题 在脚本中使用sed的时候,很可能需要在sed中引用shell变量,甚至想在sed命令行中使用变量替换.也许很多人都遇到过这个问题,但引号却死活调试不出正确的位置.其实这不是sed的问题,而是shell的特性.搞懂sed如何解决引号的问题,对理解shell引号问题有

So Easy! Oracle在Linux上的安装配置系列四

So Easy! Oracle在Linux上的安装配置系列四  监听器的配置 在创建了数库和各种数据库对象并装载了数据后,下一步是在数据库服务器与使用它的用户之间建立连 接,Oracle Net Services使这种连接成为可能.Oracle Net Services组件必须"存活"在客户机和服务器上,它们一般使用TCP/IP网络协议来建立客户机和数据库服务器之间的网络连接. 本文官方文档位置: http://docs.oracle.com/cd/E11882_01/network.

Apache Kafka系列(四) 多线程Consumer方案

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程Consumer方案 本文的图片是通过PPT截图出的,读者如果修改意见请联系我 一.Consumer为何需要实现多线程 假设我们正在开发一个消息通知模块,该模块允许用户订阅其他用户发送的通知/消息.该消息通知模块采用Apache Kafka,那么整个架构应该是消息的发布者通过Producer调用AP