7月5日测试

问题 A: 重复字符串

时间限制: 1 Sec  内存限制: 256 MB
提交: 230  解决: 105
[提交][状态][讨论版]

题目描述

给定两个字符串a和b,我们可以定义一些操作:a*b为将字符串a和字符串b连接起来,比如a= "aoe",b= "jkw",那么a*b= "aoejkw"。进一步,我们可以有指数操作,a^0= "", a^1=a, a^2=a*a, a^n=a*(a^(n-1))=a*a*…*a (n个a)

现在给你一个字符串,你可以将它看成是a^n的形式,比如字符串"abababab",可以认为是"abab"^2, 也可以是"abababab"^1,还可以是"ab"^4。

现在问题是,给定的字符串,我们想让它变成a^n中的n达到最大,那么这个n最大是多少?例如:"abababab"最大的n是4。

输入

第一行,一个整数m,表示有m个字符串。

接下来m行每行输入一个只含小写字母的字符串。

输出

输出m行,对于每行输出相应字符串的最大n。

样例输入

3
abcde
aaaaaa
abababab

样例输出

1
6
4

提示

30% 的数据:字符串的长度≤1000 ;

100%的数据:字符串的长度≤1000000 , m≤10字符串内只含小写字母 。

var n,i,m,j,asdasd:longint;
s:array[1..10]of ansistring;
st:ansistring;
function ok(i:longint):boolean;
 var j,x:longint;
begin
 x:=1;
 for j:=1 to n do
  begin
   if st[j]<>st[x] then exit(false);
   inc(x); if x>i then x:=1;
  end;
 exit(true);
end;
begin
 readln(m);
 for i:=1 to m do readln(s[i]);
 for j:=1 to m do
  begin
   st:=s[j]; n:=length(st);
   for i:=1 to n do
    begin
     if (n mod i=0)and(ok(i)) then
      begin
           writeln(n div i);
           break;
      end;
    end;
   end;
end.

此题做法考场上想到了用暴力做(还A了),含义还不是很懂

其实好像还能用KMP的next数组做(完全不会)

var
q,t,len,i,tot,k:longint;
flag:boolean;
f:array[0..2000011] of longint;
s:ansistring;
function find(i,k:longint):longint;
begin
  if k=0 then exit(0);
  if s[i]=s[f[k]+1] then exit(f[k]+1)
                       else exit(find(i,f[k]));
end;
procedure debug();
var i:longint;
begin
    for i:=1 to len do
    write(f[i],‘  ‘);
    writeln;
end;
begin
  readln(t);
  for q:=1 to t do
  begin
    readln(s);
    len:=length(s);
    fillchar(f,sizeof(f),0);
    for i:=2 to len do
    begin
      k:=i-1;
      while (s[i]<>s[f[k]+1])and(k<>0) do
      begin
        k:=f[k];
      end;
      if k=0 then f[i]:=0 else f[i]:=f[k]+1 ;

    end;
    tot:=f[len];
    if tot=0 then begin writeln(‘1‘); continue; end;
    i:=tot+1;
    flag:=true;
    while i<=len do
    begin
      if s[(i-tot) mod tot]<>s[i] then begin flag:=false; break; end;
      i:=i+1;
    end;
    if flag then writeln(len div (len-tot))
         else writeln(‘1‘);

  end;
end.

B: Fibonacci进制

时间限制: 1 Sec  内存限制: 256 MB
提交: 300  解决: 62
[提交][状态][讨论版]

题目描述

定义一种Fibonacci进制,可以将十进制数用Fibonacci数表示。Fibonacci进制中,每个位上的数值只有0或1,权值是Fibonacci数。令f0=f1=1,fi=fi-1+fi-2, N=an*fn+an-1*fn-1+…+a1*f1,写成N=anan-1..a2a1f。Fibonacci表示中,不能出现相邻的两个1。例如:自然数(十进制)表示为Fibonacci进制为1=1F,2=10F,3=100F,4=3+1=101F,5=1000F,6=5+1=1001F,7=5+2=1010F。

现在,Bsny将所有自然数按照Fibonacci进制,依次输出在屏幕上,110100101100010011010……现在,Bsny想知道这个长串的前N个数字中,包含多少个1。

输入

第一行一个整数N,表示统计范围是自然数的Fibonacci
表示的前N个数字

输出

一个数,前N个数字中1的个数。

样例输入

21

样例输出

10

很好的题,我们可以先找归率.令fib[i]表示长度为i的数的个数,其实就是第i个斐波那契数(顺便表示一下斐波那契数本身),W[i]数组表示第i组数的中一的个数(这里有一个很重要的递推关系——W[i]=F[i]+W[i-2]就是第i位为0第i加一位必为1,所以脑补一下就是啦。WC[i]表示W[i]的前缀和。具体见代码注释。

//finally modified by lhq;
//add some note;
#include<bits/stdc++.h>
using namespace std;

static long long F[90], W[90], WC[90], P, Q;

long long fsum(int n, long long P) {    //加上n位数前P个数中"1"的个数;
//  fprintf(stderr, "%d %I64d\n", n, P);
  if (!P) return 0;
  if (P == 1) return 1;
  assert (P > 0 && P < F[n]);
  if (P < F[n-1]) {    // F[i]表示n-1位数的个数;
    return fsum(n-1,P);
  } else {       //若这种情况,n-2位为0的所有数“1”的和可以看做所有n-1位数"1"的和,就是把n位的"1"右移一位;
    P -= F[n-1];
    return W[n-1]+P+fsum(n-2,P);
    //剩下的n-2位为"1"的数有P-F[n-1]个,把最高位上的"1"加上就是n-2位数前P-F[n-1]个数中"1"的个数,递归调用;
  }
}

int fn (int r, int n, long long P) {    //加上n位数中第P个数前r位;分2种情况,最高位为0或1;
  if (r <= 0) return 0;
  return P < F[n+1] ? fn(r-1,n-1,P) : 1+fn(r-2,n-2,P-F[n+1]);
}

int main () {
  int n, i, r;
  freopen ("fib.in", "r", stdin);
  freopen ("fib.out", "w", stdout);
  F[1] = W[1] = WC[1] = 1;
  for (i = 2; i < 90; i++) {
    F[i] = F[i-1] + F[i-2]; //fib数列,1,1,开始,fib[i]同时表示i位数的个数;
    W[i] = F[i] + WC[i-2];//i位数的"1"的个数;
    WC[i] = W[i] + WC[i-1];//W数组的前缀和;
  }
  assert(scanf("%I64d",&P) == 1);
  n = 1;
  while (n * F[n] <= P) {
    P -= n*F[n];
    Q += W[n];
    n++;
  }
  //Q已经加上了完整位中的所有"1";
  r = P % n;
  P /= n;
  Q += fsum(n,P);
  //fprintf(stderr,"%d %d %I64d\n",r,n,P+F[n+1]);
  Q += fn(r,n,P+F[n+1]);
  printf("%I64d\n",Q);
  return 0;
};

顺便说一下assert,就是里面东东是错的话编译器会提醒你滴

问题 C: 发奖金

时间限制: 1 Sec  内存限制: 256 MB
提交: 199  解决: 15
[提交][状态][讨论版]

题目描述

Bsny最近公司运作不佳,本年度利润才m元,但员工的奖金还是要发的,公司有n个员工,怎么发奖金这个完全由老板Bsny自己决定。Bsny想要么把这m元全发了,激励一下员工,但具体怎么分配方案有很多。比如m=1, n=2, 那么可以员工1发1元,员工2发0元;也可以员工1发0元,员工2发1元,有两种方案。

但其实,Bsny还是有点吝啬的,他想这m元不一定全部作为奖金,可以部分留给自己,这样的话,发奖金的方案数就更多了。还是以m=1, n=2为例子:

方案1:员工1发1元,员工2发0元

方案2:员工1发0元,员工2发1元

方案3:员工1发0元,员工2发0元

意味着老板Bsny发的奖金范围为[0, m]。

好奇的Bsny想知道,给定n和m,他有多少种发奖金的方案?这个答案很大,所以再给定一个p,最终的答案取模p的余数.

输入

第一行三个整数n, m, p。

输出

仅一行,一个整数表示最终的答案取模p的余数。

样例输入

2 1 5

样例输出

3

此题各种数学小模板凑,首先答案就不好搞——把n元钱分给m个人的方案数怎么求?(0<=n<=N)

这里介绍两种方法,首先,我们把n元钱看成n个球,然后用m-1个挡板把它分成m份,所以总方案数是(n-1)C(m-1)(有n-1个空隙),但这样是不能有一块为0的情况的,所以我们将求加上m个以后每块中减去一个,就能有0的情况了。为(n+m-1)C(m-1)。

然后这边有一个求和公式:sigma((n+m-1)C(m-1))0<=m<=M ===(n+m)C(m);——ZYD大佬说他不清楚,貌似具体数学上有

然后算出了答案为sigma(n+m)C(m)然后将它转化成阶乘的形势取个模就行啦(超复杂)

贴标程

#include <cstdio>
#include <iostream>
using namespace std;

typedef long long LL;
const int N = 100005;

LL w[N];
LL fac[N], inv[N];
LL p[N], c[N], cntP, cnt, a0, a1, m0, m1, P, mo;
int n, m, ID;

LL power(LL x, LL y, LL M)
{
    LL ans = 1;
    for (; y > 0; y >>= 1) {
        if (y & 1) {
            ans *= x;
            if (M != -1) ans %= M;
        }
        x *= x;
        if (M != -1) x %= M;
    }
    return ans;
}

LL calcfac(LL n)
{
    if (n < p[ID]) return fac[n];
    LL seg = n / P, rem = n % P;
    LL ret = power(fac[P - 1], seg, P);
    ret = ret * fac[rem] % P;
    cnt += n / p[ID];
    ret = ret * calcfac(n / p[ID]) % P;
    return ret;
}

LL calcinv(LL n)
{
    if (n < p[ID]) return inv[n];
    LL seg = n / P, rem = n % P;
    LL ret = power(inv[P - 1], seg, P);
    ret = ret * inv[rem] % P;
    cnt -= n / p[ID];
    ret = ret * calcinv(n / p[ID]) % P;
    return ret;
}

LL exgcd(LL a, LL b, LL &x, LL &y)
{
    if (b == 0) {
        x = 1; y = 0;
        return a;
    } else {
        LL r = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return r;
    }
}

LL getinv(LL i, LL P)
{
    LL x, y;
    exgcd(i, P, x, y);
    x %= P;
    x += (x < 0) * P;
    return x;
}

LL solve()
{
    P = power(p[ID], c[ID], -1);
    fac[0] = 1;
    for (int i = 1; i < P; ++i) {
        fac[i] = fac[i - 1];
        if (i % p[ID] != 0)
            fac[i] = fac[i] * i % P;
    }
    inv[0] = 1;
    for (int i = 1; i < P; ++i) {
        inv[i] = inv[i - 1];
        if (i % p[ID] != 0)
            inv[i] = inv[i] * getinv(i, P) % P;
    }
    cnt = 0;
    LL ret = calcfac(n);
    //cout << ret << " " << cnt << endl;
    for (int i = 1; i <= m; ++i) {
        ret = ret * calcinv(w[i]) % P;
        //cout << w[i] << " " << ret << " " << cnt << endl;
    }
    ret = ret * power(p[ID], cnt, P) % P;
    return ret;
}

void solve_equation(LL a, LL b, LL c, LL &k, LL &l)
{
    exgcd(a, b, k, l);
    k *= c;
    k %= b;
    k += (k < 0) * b;
    return;
}

int main()
{
    freopen("reword.in", "r", stdin);
    freopen("reword.out", "w", stdout);
    cin>>n>>m>>mo;
    for (int i = 2; i < 100000; ++i) if (mo % i == 0) {
        p[++cntP] = i;
        for (; mo % i == 0; mo /= i) ++c[cntP];
    }
    w[1]=n,w[2]=m;
    n=n+m;
    m=2;
    LL sw = 0;
    for (int i = 1; i <= m; ++i) sw += w[i];
    if (n - sw > 1) w[++m] = n - sw;
    for (int i = 1; i <= cntP; ++i) {
        ID = i;
        a1 = solve();
        m1 = power(p[i], c[i], -1);
        if (i == 1) {
            a0 = a1;
            m0 = m1;
        } else {
            LL k, l;
            solve_equation(m0, m1, a1 - a0, k, l);
            a0 = a0 + k * m0;
            m0 *= m1;
        }
    }
    printf("%d\n", a0);
    return 0;
}
时间: 2024-11-05 13:01:21

7月5日测试的相关文章

7月29日测试

今天第一次考试,题目是不难,但是还是有些细节不太注意,,:还有就是提交文件的步骤要精确:否则就零分了:. 1)分配任务 [问题描述] 在社会实践活动中有三项任务分别是:种树.采茶.送水.依据小组人数及男生.女生人数决定小组的接受任务,人数小于10人的小组负责送水(输出water),人数大于等于10人且男生多于女生的小组负责种树(输出tree),人数大于等于10人且男生不多于女生的小组负责采茶(输出tea).输入小组男生人数.女生人数,输出小组接受的任务. [输入]一行两个空格隔开的数,表示小组中

android客户端应用(native app)适配测试自动化 东海陈光剑 2014年5月5日 0:39:04

未命名 android客户端应用(native app)适配测试自动化 东海陈光剑 2014年5月5日 0:39:04 http://10.125.1.58:88/report.html?run_stamp=20140428054354&min=3&sec=214 <!doctype html><html><head>    <meta charset="UTF-8">    <title>适配测试报告<

ThoughtWorks北京活动|7月12日BQMeetUp,测试君自己的小圈子

Better Quality Meet Up背后的故事: 自2010年至今,ThoughtWorks已经成功主办了20场BQConf(Better Quality Conference)测试盛会,与微软.淘宝.阿里巴巴.京东.CA.NHN等全国各地的测试工作者一起合作,共同组织.打造中国软件测试领域最专业的交流和学习分享平台. 今天,我们希望做的更多更好,我们希望再搭建一个深度交流的小平台BQMeetUp(Better Quality Meet Up).让话题更小,让我们聊的更细,让我们更具体的

7月27日云栖精选夜读:AI时代_运维和测试岗位如何开启&quot;第二春&quot;?

原文地址 面临一个个利好消息:devops.开发自运维.持续集成.开发自测试.自动化测试,机器人吃人的时代不远了.作为运维,作为测试,在成为瓶颈甚至障碍绊脚石之前,如何开启职业的"第二春"? 热点热议 AI时代,运维和测试岗位如何开启"第二春"? 作者:rdc鼓励师   发表在:协同研发DRC 持续交付和质量红线牵手,RDC自动化测试和持续集成服务上线 作者:rdc鼓励师   发表在:协同研发DRC 从网络中间件到搜索,从移动开发到分布式计算平台,阿里高级专家李睿博

李宁-2015年7月13日-个人文档

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作,而各部分的客户端的操作都要与服务器端通信,所以在今天的调试中,我贯穿于各部分模块的调试和检测,主要负责在出现问题时查找问题所属是客户端还是服务器端,针对服务器端出现的问题进行查找和修改. 上午我们的工作重心在于服务器端连接数据库,由于连接数据库是我们的项目中的一个核心部分,如果无法连接数据库,所有工作将无法继续展开,在此项目之前,我们接触Java连接数据库只在网页程序中接触过,并没有接触过普通的Java项目连接

路冉的JavaScript学习笔记-2015年1月23日

1.JavaScript的数据类型 A.原始类型:包含数值.字符串.布尔值.空值(null)和未定义值(undefined). Js原始类型均为不可改变类型.对不可变类型调用任何自带方法都不会改变原始值,除非重新赋值.例如: var s="Hello,World"; s.toUpperCase();//将字串全部大写 console.log("s的值为:"+s); 在Firefox Firebug控制台内执行结果为: B.对象类型:对象为Js类的实例,使用“构造函数

指付通盗刷信用卡维权连载--9月5日给上海银监局的一封信

事件背景:指付通本来是一种支付手段的创新,通过关联用户的指纹和信用卡,之后可以通过指纹方式进行直接验证支付.但是2014年9月1日中午发生的点佰趣公司盗刷每个用户100元年费的事情,立即引起的渲染大波.据称受影响用户达到5000人之众,相关的维权为此立即拉开帷幕. 时间发生70个小时内的成果:1) 35小时新闻夜线播出:2) 55小时他们发布公告(虽然公告我们不满意):3) 70小时内新闻晨报报道.革命尚未成功,大家仍需努力!不放弃,不自欺,继续向我们目标执着前行. 维权方针: 我们理性维权,是

(X6支持https)2017年9月15日友价T5X6商城站长交易源码仿互站送手机版程序8套模版

(https专版)2017年9月15日友价T5X6商城站长交易源码仿互站送手机版程序8套模版 修复官方版本的各种问题,, 安装步骤,1.将源码上传到主机,2.专入数据库文件.依次导入codes_170915.sql codes_data.sql codes_data_city.sql后台用户名密码: admin admin123 友价源码 X620170915补丁(主要修复https SSL及兼容问题) 以下是本次补丁的升级内容: 1.修复https微信登录功能2.手机版SSL错误,兼容http

每日会议记录5月6日

会议内容: 今日是5月6日,我们的打地鼠游戏项目正式启动,因为是第一次组织会议所有还没有多的进展我们进行了进一步的项目细分. 首先我们结合情况确立了一个方向,决定用C#语言来编写这个游戏软件,主要是因为大家对于C#语言掌握程度更加熟练,可以更好的做好这次的项目,同时为每一位组员的电脑安装了统一的编程软件(VS2015版本). 通过一次自愿的选择确立了每个人在项目阶段所要负责的部分,同时我们将项目细分了几个阶段,第一阶段由组长林吉庆负责项目的统一规划与大体的项目架构,组员张泽凯先进行窗体的布局设置