9.20 模拟试题

请注意,所有题目使用文件输入输出。输入文件名、输出文件名前缀同题目名前缀,输入文件名后缀为.in,输出文件名后缀为.out。

例如,对于第一题,输入文件为count.in,而输出文件名为count.out。

TL、ML分别表示时间限制、内存限制。

Good Luck & Have Fun

 

kAc

A 约数之和(count.pas/c/cpp)

TL:1S  ML:128MB

【Description】

我们用D(x)表示正整数x的约数的个数。给定一个正整数N,求D(1)+D(2)+…+D(N)。

【Input】

一行一个正整数N。

【Output】

一行一个整数,表示答案

【Sample Input】

5

【Sample Output】

10

【Hint】

样例解释:

D(1)=1 D(2)=2

D(3)=2 D(4)=3 D(5)=2

对于20%的测试数据:N<=1000

对于50%的测试数据:N<=100000

对于100%的测试数据:N<=10000000

我们先考虑一个函数f‘[i],设f‘[i]为i的约数的个数,那么显然f‘[i]为积性函数,我们可以用线性筛得到,仔细观察可以发现f[i] = f‘[1] + f‘[2] + ... + f‘[i],比如f[6] = f‘[1]+f‘[2]+...+f‘[6] = 1+2+2+3+2+4 = 6+3+2+1+1+1 = 14,下面简单解释一下线性筛是如何得到一个数约数的个数的,首先根据约数个数定理:对于一个大于1的正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,则n的正约数有(a?+1)(a?+1)(a?+1)…(ak+1)个,又我们知道线性筛筛质数每次筛的都是用最小的质因子去筛,因此我们可以记录这个最小质因子唯一分解后的次幂然后通过上面的公式求解。

#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
bool vis[N];
int n,tot,pri[N],d[N];
long long ans,f[N],ff[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int work()
{
    ff[1]=1,f[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            pri[tot++]=i;
            d[i]=1,ff[i]=2;
        }
        for(int j=0;j<tot&&i*pri[j]<=n;j++)
        {
            vis[i*pri[j]]=true;
            if(i%pri[j])
            {
                ff[i*pri[j]]=ff[i]*2;
                d[i*pri[j]]=1;
            }
            else
            {
                ff[i*pri[j]]=ff[i]/(d[i]+1)*(d[i]+2);
                d[i*pri[j]]=d[i]+1;
                break;
            }
        }
        f[i]=f[i-1]+ff[i];
    }
}
int main()
{
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    n=read();
    work();
    ans=f[n];
    printf("%I64d\n",ans);
    return 0;
}

50分,MLE(其实少开两个数组就可以A了的、、)

#include<cstdio>
#include<algorithm>
#define N 10000100
using namespace std;
int n,tot,pri[N],d[N],ff[N];
long long ans;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int work()
{
    ff[1]=1;ans=1;
    for(int i=2;i<=n;i++)
    {
        if(!d[i])
        {
            pri[tot++]=i;
            d[i]=1,ff[i]=2;
        }
        for(int j=0;j<tot&&i*pri[j]<=n;j++)
        {
            if(i%pri[j])
            {
                ff[i*pri[j]]=ff[i]*2;
                d[i*pri[j]]=1;
            }
            else
            {
                ff[i*pri[j]]=ff[i]/(d[i]+1)*(d[i]+2);
                d[i*pri[j]]=d[i]+1;
                break;
            }
        }
        ans+=ff[i];
    }
}
int main()
{
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    n=read();
    work();
    printf("%I64d\n",ans);
    return 0;
}

AC代码

O(n)做法,我们枚举因子,一个因子的倍数的一个约数一定是这个因子,那么我们求出一个数的倍数的个数即为求出了所有有当前因子的数的个数

#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long ans;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int main()
{
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)
     ans+=n/i;
    printf("%I64d\n",ans);
    return 0;
}

O(n做法)

B 邮局选址(post.pas/c/cpp)

TL:1S  ML:128MB

【Description】

在 J 市的一条笔直的公路旁分布着 n 个村庄,每个村庄都有一个唯一的坐标 Xi,任意一对村庄的坐标不同。最近,J 市领导计划在村庄里新建 m 个邮局,而邮局在 n个村庄里的分布情况会影响到居民的便利程度。

设 m 个邮局分别建在 P1,P2,..,Pm 号村庄。每个村庄的村民都会找到与其距离最近的一个邮局,若有多个距离最近的则会任选一个,该村庄的便利度即为该村庄与其最近的邮局的距离,而所有村庄的便利度的和即为总便利度。

严格地讲,总便利度 C定义为

现在,由你来安排邮局的建设位置。请计算最小的 C 是多少。

【Input】

第一行两个整数 n m

第二行递增的n 个整数,表示 X1..Xn

【Output】

一行一个整数,表示最小的 C

【Sample Input】

10 5

1 2 3 6 7 9 11 22 44 50

【Sample Output】

9

【Hint】

样例解释:建立在坐标为:2 7 22 44 50的位置

每个村庄的便利度分别为:1 0 1 1 0 2 4 0 0 0

对于30%的测试数据  n ≤ 10

对于60%的测试数据   n ≤ 50

对于100%的测试数据  1 ≤ n ≤ 300; 1 ≤ m ≤ 30; m ≤ n; 1 ≤ Xi ≤ 10000

dp

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1000
using namespace std;
bool vis[N];
long long ans=0x3f;
int n,m,x[N],f[N][N],dp[N][N],q[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int main()
{
    freopen("post.in","r",stdin);
    freopen("post.out","w",stdout);
    n=read(),m=read();
    memset(dp,0x3f,sizeof(dp));
    for(int i=1;i<=n;i++)
     x[i]=read();
    for(int i=1;i<=n;i++)
     for(int j=i;j<=n;j++)
     {
         int mid=(i+j)/2;
         for(int k=i;k<=j;k++)
          f[i][j]+=abs(x[k]-x[mid]);
      } //处理出只放一个邮局的情况。我们可以知道如果只让一个邮局的话,邮局的位置一定是放在中间的。
    for(int i=1;i<=m;i++)
     dp[i][i]=0;//如果在当期点放邮局的话,那当前的最短距离为0
    for(int i=1;i<=n;i++)//在i这个地方放邮局的话
    {
        dp[i][1]=f[1][i]; //放一个邮局且放在当前点的话最终值为从第一个点到当前点的便利度
        for(int j=2;j<=min(m,i);j++)//枚举到当前点放几个邮局
        {
            if(i==j) continue;
            dp[i][j]=dp[i-1][j-1];
            for(int k=j-1;k<=i;k++)
             dp[i][j]=min(dp[i][j],dp[k][j-1]+f[k+1][i]);//枚举上一个放邮局的地方
        }
    }
    ans=dp[n][m];
    printf("%I64d",ans);
    return 0;
}

dp

C 分数(fraction.pas/c/cpp)

TL:2S  ML:128MB

【Description】

在一门叫做计算机应用数学的神奇的课上,老师教给大家如何处理小数的进制转换:

p进制的小数abc.def的十进制值为:

 

例如十进制数在十进制下小数表示为0.33333…,在三进制下为0.1,在三十进制下为0.A。(这里A的含义与十六进制中A的含义相同,均表示10)。

下课后,老师要求kAc将N个十进制的分数写成k进制下的小数。然而kAc发现,很多十进制分数根本不可能写成有限的k进制小数!这令他十分不爽,不过他想知道,最小需要几进制才能使得这些十进制分数在该进制下均为有限的小数。

【Input】

第一行两个整数N

接下来N行,每行两个整数a, b,表示一个十进制小数

【Output】

一个整数,表示最小进制数。这里,请按照十六进制输出,所有字母全部大写。(例如,如果答案为十进制下26,则输出1A)。

【Sample Input】

2

3 99

1 99

1 11

【Sample Output】

21

【Hint】

样例解释:

在33进制下,可以表示为0.1,可以表示为0.0B,可以表示为0.3。

可以证明不存在更小的进制,使得他们均为有限小数。

对于20%的测试数据:n=1

对于50%的测试数据:n<=10,a, b <= 10000,保证最终答案在十进制下不超过10000。

对于70%的测试数据:n<=100,a, b<= 10000。

对于100%的测试数据:n<=1000,1 <= a,b <= 1000000000。

弃疗,完全没有心情看了。。。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define pz putchar(‘0‘);
#include <map>
using namespace std;
const int MO = 15;
struct Big{
    int len, data[10001];
    void clear() { memset(this, 0, sizeof(*this)); }
    int & operator [] (int k) { return data[k]; }
    Big & operator = (int k)
    {
        clear();
        len = 0;
        while(k){
            ++len; data[len] = k & MO; k >>= 4;
            }
        if (len == 0) ++len;
        return *this;
    }
    Big operator * (Big & A)
    {
        Big temp; temp.clear(); temp.len = len + A.len - 1;
        for (int i = 1; i <= len; i++)
            for (int j = 1; j <= A.len; j++){
                temp[i + j - 1] += A[j] * data[i];
                temp[i + j] += (temp[i + j - 1] >> 4);
                temp[i + j - 1] &= MO;
                }
        while(temp[temp.len + 1]) ++temp.len;
        return temp;
    }
    void print()
    {
        for (int i = len; i >= 1; i--) printf("%X", data[i]);
        putchar(‘\n‘);
    }
} temp, ans;
map<int, bool> M;
bool f[1000001];
int pnum, p[100001];
void GETP(int M)
{
    memset(f, 1, sizeof(f)); f[0] = f[1] = false;
    p[pnum = 1] = 2;
    for (int now = 2; now < M;){
        for (int j = now + now; j <= M; j += now) f[j] = false;
        ++now; while(now < M && !f[now]) ++now;
        if (f[now]) p[++pnum] = now;
        }
}
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
void work(int num)
{
    for (int i = 1; i <= pnum; i++)
    {
        if (num % p[i] == 0)
            if (M[p[i]] == 0)
            {
                M[p[i]] = true;
                temp = p[i];
                ans = ans * temp;
            }
        while(num % p[i] == 0) num /= p[i];
    }
    if (num != 1)
        if (M[num] == 0)
        {
            M[num] = true;
            temp = num;
            ans = ans * temp;
        }
}
int main()
{
    freopen("fraction.in", "r", stdin); freopen("fraction.out", "w", stdout);
    ans = 1;
    int t; scanf("%d", &t);
    GETP(100000);
    while(t--)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        int d = gcd(a, b); a /= d; b /= d;
        work(b);
    }
    ans.print();
}

粘个标程

时间: 2024-10-18 07:05:51

9.20 模拟试题的相关文章

2014年软考-信息技术处理员-模拟试题及答案【第二章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●计算机网络的主要目标是实现____(16 )__C__. A.数据处理 B.文献检索 C.资源共享和信息传输 D.信息传输 ●Internet上,访问Web网站时用的工具是浏览器.下列____(17 )_A___就是目前常用的Web浏览

2014年软考-信息技术处理员-模拟试题及答案【第十章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●任何一类信息系统都是由信源.信道和____(16)B____三者构成. A.载体 B.信宿 C.信息 D.接收端 ●信息系统一般包括数据处理系统.管理信息系统.决策支持系统和____(17)D____. A.办公自动化系统 B.电子政务

模拟试题B

模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多形边面片的数量非常大的情况下,哪一个消隐算法速度最快? ( ) A)深度缓存算法(Z-Buffer) B)光线跟踪算法 C)画家算法 D)不确定 3.双线性光强插值法(Gouraud Shading)存在哪些问题?( ) A)光照强度在数值上不连续 B)生成多面体真实感图形效果差 C)生成曲面体真实

模拟试题C

模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编码裁剪法裁剪二维线段时,判断下列直线段采用哪种处理方法.假设直线段两个端点M.N的编码为1000和1001(按TBRL顺序)( ) A)直接舍弃 B)直接保留 C)对MN再分割求交 D)不能判断 3.下面哪个不是齐次坐标的特点( ) A)用n+1维向量表示一个n维向量 B)将图形的变换统一为图形的坐

计算机职称考试题库Internet模块操作练习模拟试题(一)

1.请为当前计算机添加连接到com1口的标准56000 bps调制解调器设备,要求不检测当前连接设备. 当前界面:开始à控制面板 方法一: 打开[电话和调整解调器选项]à[调整解调器]选项卡à[添加]按钮à选中[不要检测我的调制解调器设备……]à下一步à型号:标准 56000 bps 调制解调器à下一步à选定的端口:com1à下一步à完成 方法二: 添加新硬件à下一步à选择[是,我已经连接了此硬件]à下一步à列表拉到最后选择[添加新的硬件设备]à下一步à选择[安装我手动从列表选择的硬件(高级)]

2014年软考-信息技术处理员-模拟试题及答案【第一章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●在计算机内部用来传送.存储.加工处理的数据或指令都是以____(1)_B___形式进行的. A. 十进制码 B.二进制码 C.八进制码 D.十六进制码 ●如果一个存储单元能存放一个字节,那么一个32KB的存储器共有____(2)_B__

2014年软考-信息技术处理员-模拟试题及答案【第三章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●备注视图中的注释信息在文稿演示时____(31)__B__. A.会显示 B.不会显示 C.显示一部分 D.显示标题 ●Access 2000关系数据库是____(32)_D___的集合. A.数据 B.数据库对象 C.表 D.关系 ●

2014年软考-信息技术处理员-模拟试题及答案【第四章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●Office家族为用户提供了各种不同类型的模板.扩展名为.mdz的模板是____(41)D____中的模板. A.Word B.Excel C.PowerPoint D.Access ●在Excel中,选取一行单元格的方法是____(4

2014年软考-信息技术处理员-模拟试题及答案【第五章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●管理信息系统科学的3要素是系统的观点.数学的方法和____(51)A____. A.计算机的应用 B.计算机科学 C.计算机理论 D.计算机方法 ●知识产权可分为:____(52)___C_两类. A.农业产权和著作权 C.工业产权和著