1 1
1 2
1
4
令f(n)的含义实际上是有多少对(a,b)满足a*b<=n(自己没想到,在叉姐指导下才弄明白,感谢),那么我们可以领g(n)表示有多少对(a,b)满足a*b=n,然后对g求个前缀和f(n)就出来了。
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; const ll mod = 1007; #define rep(i,a,b) for(int i=(a);i<(b);i++) #define pb push_back ll f[maxn]; void init(int n) { memset(f,0,sizeof f); for(int i = 1; i <= n; i++) for(int j = i; j <= n; j += i) f[j]++; for(int j = 1; j <= n; j++) { f[j] = (f[j]+f[j-1])%mod; } for(int j = 1; j <= n; j++) { f[j] = (f[j]+f[j-1])%mod; } } int main() { init(1000000); int L,R; while(~scanf("%d%d",&L,&R)) { printf("%d\n", (f[R]-f[L-1]+mod)%mod); } return 0; }
原文地址:http://blog.csdn.net/acvcla/article/details/45546801