关闭

Codeforces Round #304 (Div. 2)-D. Soldier and Number Game,素因子打表!

289人阅读 评论(0) 收藏 举报
分类:

D. Soldier and Number Game
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
-> Link <-


   题目链接呈上;

  题意:两个人玩游戏,其中一个人选一个数n给另外一个人,然后每轮选一个数x使得n能被x整除,然后用n/=x;注意x>1;问要使得另一个人得分最高,最高多少;即最多能够玩几轮n变成了1,为了使游戏更加有趣,给出两个数a,b;n=a!/b!;其中数据范围是500,0000;

  思路:我们观察样例,第一组n=3!/1!=6,然后6可以选2或3进行整除,得到的还是2或3,因为这个时候变成了素数再选只能选本身才能整除;所以只有2轮;再看第二组,n=6!/3!=120;所以n=120/2=60/2=30/2=15/3=5/5=1;总共5轮,我们的目的是什么?要使得n尽量多整除几轮,所以每次都选一个最小的素因子来整除,这样所得的分才最高;那么选最小的素因子怎么选呢?我们观察到:6=2*3,120=2*2*2*3*5;明白了吧,这个n的拆分的素因子个数就是最多能整除的轮数,那么我们就是要求出n的素因子个数了,题目数据比较大,直接求得用到高精度,我们来看n是怎么得来的呢?n=a!/b!,题目已表明b<=a,所以n=(b+1)*(b+2)*(b+3)*...*a;,我们只需求出从b+1到a中的素因子个数就是答案了,基于数据太大,所以我们要打表求出 1 - 5000000中每个数的素因子数;

  然而比赛的时候想到了一种方法,却疏漏了一点致使成功离我们远去;我们观察到4=2*2,有2个,而8=2*2*2,有三个;再看6=2*3,有2个,12=6*2,有2+1个,所以当时想的方法就是用各个因子的素因子数来累加,来看这种思路代码:

const int N=5000000+10;
int a[N];
int main()
{
    memset(a,0,sizeof(a));
    for(int i=2; i<=N; i++)
        if(!a[i])//就是没考虑到这里,所以以为会超时直接不敢写了...............
        {
           for(int j=i;j<=N;j+=i)
            a[j]=a[j/i]+1;
        }
        for(int i=2;i<=N;i++)//这里要注意累加,因为查询次数比较多,每次都用循环累加也是会超时的;
            a[i]+=a[i-1];
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
         printf("%d\n",a[n]-a[m]);
    }
    return 0;
}


 再来看另一种思路打表代码:

const int N=5000000+10;
int a[N];
int main()
{
    memset(a,0,sizeof(a));
    for(int i=2; i<=N; i++)//这居然也不超时..古凯队长也是叼;;
        if(!a[i])
        {
            long long temp;
            for(temp=i;temp<=N;temp*=i)
                for(long long j=temp;j<=N;j+=temp)
                a[j]++;//这种更好理解一点,直接加上去;
        }
        for(int i=2;i<=N;i++)
            a[i]+=a[i-1];
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
//        scanf("%d",&n);
//        printf("%d\n",a[n]);
        scanf("%d%d",&n,&m);//其实当n==m时n==1,直接输出0,特判一下省时间;;
         printf("%d\n",a[n]-a[m]);
    }
    return 0;
}

0
0
查看评论

Codeforces Round #304 (Div. 2) A,B,C题解

A. Soldier and Bananas time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output A soldi...
  • qq_24489717
  • qq_24489717
  • 2015-05-27 13:48
  • 1001

CodeForces 546D Soldier and Number Game(求素因子+数学+前缀和)

题目链接:click here~~ 【题目大意】 两个整数a, b。求出a, a - 1, a - 2........b + 1这些整数能被拆分成多少个素数相乘,把每个的拆分结果相加起来。例如 a = 6, b = 2. 那么结果=1(3=3) + 2(4=2*2) + 1(5=5) + 2(6=2...
  • u013050857
  • u013050857
  • 2015-05-27 10:01
  • 1401

Codeforces Round #402 (Div. 2)D. String Game【二分】

D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output Litt...
  • mengxiang000000
  • mengxiang000000
  • 2017-02-27 13:11
  • 242

Codeforces Round #460 (Div. 2) D. Substring(拓扑排序)

题目链接题意:有一个n个点m条边的有向图,每个节点有一个字母,路径的权值是路径上相同字母的最大个数。求最大的路径权值。思路:因为只有26个字母,所以直接假设其中一个字母为相同字母数最大的字母。枚举每一个字母,通过拓扑排序找到最大权值,取其中的最大值就是答案。当图中存在环时,答案就是无穷大,输出-1;...
  • cyf199775
  • cyf199775
  • 2018-02-01 13:55
  • 43

Codeforces Round #304 (Div. 2) D. Soldier and Number Game (打表)

time limit per test  3 seconds memory limit per test  256 megabytes input  standard input output  standard output Two sol...
  • lu_1110
  • lu_1110
  • 2016-08-14 19:15
  • 164

Codeforces Round #460 (Div. 2) D. Substring

题目链接:D. Substring 题目大意 一张有向图,每个结点上有一个字母,定义一条路径的权值为路径中出现次数最多的字母的出现次数,求图中权值最大的路径的权值,如果权值可以无限大,输出-1 思路 26次DFS,,每次只统计一个字母的权值,cnt[i]记录从i点开始的路径当前字母出...
  • litmxs
  • litmxs
  • 2018-01-31 23:25
  • 67

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include #include #include #include #include #pragma commen...
  • rowanhaoa
  • rowanhaoa
  • 2014-07-25 14:39
  • 1481

Codeforces Round #444 (Div. 2) D. Ratings and Reality Shows 贪心

http://codeforces.com/problemset/problem/887/D 题意:有一个模特,她有一个初始rating值 s。她每天可能进行拍照或show中的一种活动。每拍一次照,rating增加 a, 每参加一次show,rating减少 b。她现在想参加一次脱口秀。参加完...
  • qq_36553623
  • qq_36553623
  • 2017-11-08 23:47
  • 189

Codeforces Round #444 (Div. 2)-贪心&尺取-Ratings and Reality Shows

http://codeforces.com/contest/887/problem/D 一个模特有两种活动。 ① 拍照片,挣钱 a。 ②开演唱会,花费b 给定模特这两种工作的时间表。 模特可以选定一个时间举办一个座谈会,那么他拍照片的钱变c。开演唱会会花费d。 要求再模特座谈会之前和后l...
  • qq_35781950
  • qq_35781950
  • 2017-11-11 20:11
  • 130

Codeforces Round #369 (Div. 2) D. Directed Roads (dfs+组合数学 图论)

传送门:D. Directed Roads 描述: D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard i...
  • guhaiteng
  • guhaiteng
  • 2016-08-30 19:06
  • 374
    个人资料
    • 访问:125640次
    • 积分:4277
    • 等级:
    • 排名:第8448名
    • 原创:307篇
    • 转载:8篇
    • 译文:0篇
    • 评论:41条
    友链

      ~什么都没有~



    最新评论