zoukankan      html  css  js  c++  java
  • 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1

    Dzzq的离散数学教室1

    链接:https://www.nowcoder.com/acm/contest/96/D
    来源:牛客网

    zzq的离散数学教室1
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

        离散数学中有种名叫“哈斯图”的东西。

        在这题中,你们需要计算的是一些正整数在偏序关系“整除”下的哈斯图的边数。用大白话讲,在偏序关系“整除”下的哈斯图,就是把一个个正整数看成一个个图的节点,某些节点之间有边。连边的规则是这样的:对于任意两个正整数a和b(a<b)来说,如果b%a==0,并且不存在一个正整数c(a<c<b),使得条件b%c==0和c%a==0同时成立,那么我们就在节点a和节点b之间连一条边。

        现在问题是,给你们2个数L,R(1<=L,R<=1e6)。求由L,L+1,L+2...R这R-L+1个正整数在偏序关系“整除”下的哈斯图的边数。

        比如L=1,R=4,节点的组合有(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)。组合(1,2),(1,3),(2,4)可以连边。(1,4)因为中间存在c=2,不符合连边条件。所以当L=1,R=4的时候,这个哈斯图有3条边。

    输入描述:

    多组输入,不超过1000组数据
    每组数据一行,包含2个正整数L和R,中间由空格分开。

    输出描述:

    每组数据输出一行,包含一个整数表示哈斯图的边数。
    示例1

    输入

    1 4
    4 10
    1 10

    输出

    3
    2
    11

    备注:

    哈斯图(英语Hasse发音为/ˈhæsə/,德语: /ˈhasə/)、在数学分支序理论中,是用来表示有限偏序集的一种数学图表,它是一种图形形式的对偏序集的传递简约。具体的说,对于偏序集合(S,≤),把S的每个元素表示为平面上的顶点,并绘制从x到y向上的线段或弧线,只要y覆盖x(就是说,只要x < y并且没有z使得x < z < y)。这些弧线可以相互交叉但不能触及任何非其端点的顶点。带有标注的顶点的这种图唯一确定这个集合的偏序。

    b=xc,c=ya;所以b=xya,要是不存在c,要么x=1,要么y=1,即xy是个素数,因为只有素数才满足乘积为本身只有一种情况,就是1和它本身。比如:(L=1,R=10)1,2,3,4,5,6,7,8,9,10中(先要素数打表:2,3,5,7,11,13……),分别取乘素数,最大使得ai(ai是序列的数)*一个素数<=R。10/2=5,则s=5;10/3=3,则s=5+3=8;10/5=2,则s=8+2=10;10/7=1;s=11;

     1 #include<cstdio>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<queue>
     5 using namespace std;
     6 #define ll long long
     7 int prime[1000005],x=0;
     8 bool is[1000005];
     9 void init()
    10 {
    11     memset(is,1,sizeof(is));
    12     for(int i=2;i<1000005;i++)//i的上限不能太小
    13     {
    14         if(is[i])
    15         {
    16             prime[x++]=i;
    17             for(int j=i+i;j<1000005;j+=i)
    18                 is[j]=0;
    19         }
    20     }
    21     x--;
    22     //printf("%d
    ",x);
    23 }
    24 int main()
    25 {
    26     init();
    27     int L,R;
    28     while(~scanf("%d%d",&L,&R))
    29     {
    30         ll ans=0;
    31         for(int i=x;i>=0;i--)
    32         {
    33             int t=R/prime[i];
    34             if(t-L>=0)ans+=t-L+1;
    35         }
    36         printf("%lld
    ",ans);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    Nginx中如何配置中文域名?
    VS2012找不到EF框架实体模型的解决方法
    来自一位家长的电话
    孩子大了真是不好管了
    springboot项目不加端口号也可以访问项目的方法
    分享几个上机案例题
    今晚在学校值班……
    3班的第二次模拟面试
    Sword 09
    Sword 06
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8846989.html
Copyright © 2011-2022 走看看