描述:
Let’s denote d(n) as the number of divisors of a positive integer n. You are given three integers a, b and c. Your task is to calculate the following sum:
Find the sum modulo 1073741824 (230).
输入:
The first line contains three space-separated integers a, b and c (1 ≤ a, b, c ≤ 100).
输出:
Print a single integer — the required sum modulo 1073741824 (230).
大意:求这么一个运算的和,核心就是找到范围内所有数除数的个数,由于a,b,c最大都是100,那么范围就是1e6,找到1e6内所有数的除数个数;
思路:纯暴力打表的话复杂度是O(n2),我们当然不能纯暴力,一定要优雅的暴力,这时候要用到埃式筛的思想,埃式筛思想是:
`一个素数的倍数不是素数`
而这个题我们可以是:
一个数一定是他自己倍数的除数
我们把我们的目光从被除数转移到除数上来
这样只需要遍历每个数的倍数即可,看这个除数能做那些被除数的除数,复杂度优化了很多
代码:
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const ll maxx = 1e18; const int N = 1e6+100; const int p = 1073741824; const double eps = 1e-8; int d[N],a,b,c; ll sum; void check() { for(int i=1;i<=N;i++) { for(int j=i;j<=N;j+=i) { d[j]++; } } } int main() { check(); cin>>a>>b>>c; for(int i=1;i<=a;i++) { for(int j=1;j<=b;j++) { for(int k=1;k<=c;k++) { sum=(sum+d[i*j*k])%p; } } } cout<<sum; }
埃式筛的思想非常棒!