洛谷P2429 制杖题 [2017年6月计划 数论10]
生活随笔
收集整理的這篇文章主要介紹了
洛谷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;elseans -= (((num * (1 + cnt))%MOD * cnt)%MOD * niyuan) % MOD;ans = ans % MOD;}}printf("%lld", ans % MOD);return 0; }
?
轉載于:https://www.cnblogs.com/huibixiaoxing/p/7094709.html
總結
以上是生活随笔為你收集整理的洛谷P2429 制杖题 [2017年6月计划 数论10]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个成熟男人的个性签名。
- 下一篇: 学习地址