洛谷P2429 制杖题 [2017年6月计划 数论10]

P2429 制杖题

题目描述

求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。

输入输出格式

输入格式:

第一行二个整数 n,m。

第二行 n 个整数,表示质数集内的元素 p[i]。

输出格式:

一个整数,表示答案,对 376544743 取模。

输入输出样例

输入样例#1:

2 15
3 5

输出样例#1:

60

说明

样例解释:所有符合条件的数为 3,5,6,9,10,12,15 其和为 60。

··· 测试点编号 规模

1 2 3 n*m<=10^7
4 5 n<=2,m<=10^9
6 7 n<=20,m<=10^8
8 9 10 n<=20,m<=10^9
···

前三个点:n * m <= 1e7

不难想到暴力求解

后七个点:n <= 20,m <= 1e9

容斥+等差数列求和

利用二进制枚举各个数的乘积,利用等差数列求和,容斥原理排除多算的即可

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
inline void read(long long &x){x = 0;char ch = getchar();char c = ch;while(ch > ‘9‘ || ch < ‘0‘)c = ch, ch = getchar();while(ch >= ‘0‘ && ch <= ‘9‘)x = x * 10 + ch - ‘0‘, ch = getchar();}
inline int max(int a, int b){return a > b ? a : b;}
inline int min(int a, int b){return a < b ? a : b;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}

const int INF = 0x3f3f3f3f;
const int MAXN = 2000 + 5;
const int MOD =  376544743;

long long n,m;
long long p[MAXN];
long long ans;

int main()
{
    read(n);read(m);
    for (register long long i = 1 ; i <= n ; ++ i)
        read(p[i]);
    if(n * m <= 100000000)
    {
        for(int i = 1;i <= m;i ++)
        {
            for(int j = 1;j <= n;j ++)
            {
                if(!(i % p[j]))
                {
                    ans += i;
                    ans %= MOD;
                    break;
                }
            }
        }
        printf("%lld", ans % MOD);
        return 0;
    }

    int S = (1 << n);
    register long long num,cnt,x;
    register long long niyuan = (MOD + 1)/ 2;

    for (register long long i = 1 ; i < S ; ++ i)
    {
        register long long num = 1,cnt = 0,x = 0;
        for (register long long j = 1, k = i ; k ; ++j, k >>= 1)
            if (k & 1)num *= p[j],x ++;
        cnt = m / num;
        if (x)
        {
            if (x & 1)
                ans += (((num * (1 + cnt))%MOD * cnt)%MOD * niyuan) % MOD;
            else
                ans -= (((num * (1 + cnt))%MOD * cnt)%MOD * niyuan) % MOD;
            ans = ans % MOD;
        }
    }
    printf("%lld", ans % MOD);
    return 0;
}
时间: 2024-08-04 06:57:44

洛谷P2429 制杖题 [2017年6月计划 数论10]的相关文章

洛谷P1147 连续自然数和 [2017年6月计划 数论01]

P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从

洛谷P1573 栈的操作 [2017年6月计划 数论11]

P1573 栈的操作 题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,…,n.每一个栈只支持一种操作:弹出并 压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操作必须符合一定的规则才能进行.规则1:A栈不能为空.规则 2:B栈为空或x比B栈栈顶要小. 对于给定的n,请你求出把第四个栈的n个元素全部移到第一个栈的最少操作次数. 由于最少操作次数可能很多,请你把答案对1000007取模. 输入输出格式 输入格式: 一行,一个n 输出格式

洛谷P2347 砝码称重 [2017年4月计划 动态规划01]

P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出格式: 输出方式:Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入输出样例 输入样例#1: 1 1 0 0 0 0 输出样例#1: Total=3 暴力算法略,这里只讲dp.背包问题,每个砝码选或

洛谷P1062 数列 [2017年6月计划 数论03]

P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个空格隔开

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑

洛谷P1978 集合 [2017年6月计划 数论08]

P1978 集合 题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次. •确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居 其一,不允许有模棱两可的情况出现. 例如 A = {1, 2, 3} 就是一个集合.我们可以知道, 1 属于 A ,即 1 ∈ A : 4 不属于 A

洛谷P2667 超级质数 [2017年6月计划 数论05]

P2667 超级质数 题目背景 背景就是描述,描述就是背景...... 题目描述 一个质数如果从个位开始,依次去掉一位数字,两位数字,三位数字......直到只剩一位数字中间所有剩下的数都是质数,则称该质数为一个超级质数.例如:2333是一个质数,因为2333,233,23,2都是质数,所以2333是一个四位超级素数.请你写一个程序,给定一个整数X,求大小小于X的超级质数. 输入输出格式 输入格式: 一行,给出一个整数X(1<=X<=100000000). 输出格式: 第一行,一个整数k,表示

洛谷P1890 gcd区间 [2017年6月计划 数论09]

P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表示a[1]..a[n]. 以下m行,每行2个整数表示询问区间的左右端点. 保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 1 3 7 说明 对于30%的数据,

洛谷P1029 最大公约数和最小公倍数问题 [2017年6月计划 数论02]

P1029 最大公约数和最小公倍数问题 题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. 输入输出格式 输入格式: 二个正整数x0,y0 输出格式: 一个数,表示求出满足条件的P,Q的个数 输入输出样例 输入样例#1: 3 60 输出样例#1: 4 说明 P,Q有4种 3 60