xdu 1022(数论筛法)

1022: A simple math problem 2

时间限制: 1 Sec  内存限制: 128 MB

提交: 73  解决: 13

[提交][状态][讨论版]

题目描述

高斯函数: [x]表示,小于等于x的最大整数,即向下取整。 如 [2.5]=2,[1.2]=1等。 定义函数f(n)=[n/1]+[n/2]+[n/3]+...+[n/n] . sum(a,b)=f(a)+f(a+1)+...+f(b) 给定a,b,求sum(a,b)

输入

多组输入(不超过10000组) 每行输入 a,b,其中1<=a<=b<=1000000

输出

多组输出 每行输出sum(a,b)%1007,并换行

样例输入

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;
}
时间: 2024-11-10 03:45:24

xdu 1022(数论筛法)的相关文章

OI分类

黑字:认识 红字:要学 未添加:要学 ├─模拟├─字符串│    ├─字符串基础│    ├─kmp│    ├─trie│    ├─ac自动机│    ├─后缀数组│    └─后缀树├─搜索│    ├─深度搜索(dfs)│    ├─记忆化搜索│    ├─广度搜索(bfs)│    ├─双向广搜│    ├─回溯│    ├─A*│    ├─迭代深搜│    ├─IDA*│    └─dfs序├─动态规划│    ├─区间dp│    ├─环形dp│    ├─背包dp│    ├─

复健计划

这里就是复健计划啦!虽然实际上我只是把以前的归档复制了一遍而已啦,当然我加了一些基础的东西在里面就是了. 计划打算在七月初开始(只要不咕). 感觉是在水博客啊……没事,应该没人看(滑稽) 学完的后面打个√. 图论 建图方法 最短路 生成树 拓扑排序 Tarjan相关 2-SAT 欧拉回路 虚树 圆方树 网络流/匈牙利算法 KM 最大流最小割 费用流 二分图匹配 上下界网络流 —————————————————————— 数论 筛法 gcd/exgcd 逆元 康托展开,卡特兰数,斯特林数 卢卡斯定

数论二&#183;Eular质数筛法

#1295 : 数论二·Eular质数筛法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上次我学会了如何检测一个数是否是质数.于是我又有了一个新的问题,我如何去快速得求解[1,N]这个区间内素数的个数呢? 小Hi:你自己有什么想法么? 小Ho:有!我一开始的想法是,自然我们已经知道了如何快速判定一个数是否是质数,那么我就直接将[1,N]之间每一个数判定一次,就可以得到结果.但我发现这个方法太笨了. 小Hi:确实呢,虽然我们已经通过快速素数检测将每

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

数论 - 线性筛法与积性函数

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法) 时间复杂度:O(N*loglogN) 空间复杂度:O(N) 代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bit

数论部分第二节:埃拉托斯特尼筛法

埃拉托斯特尼筛法 质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.怎么判断n以内的哪些数是质数呢? 埃拉托斯特尼筛法 厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数:第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数:现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止.这