Description

Input

一共T+1行
第1行为数据组数T(T<=10)
第2~T+1行每行一个非负整数N,代表一组询问

Output

一共T行,每行两个用空格分隔的数ans1,ans2

Sample Input

6
1
2
8
13
30
2333

Sample Output

1 1
2 0
22 -2
58 -3
278 -3
1655470 2

Solution

裸的杜教筛。具体的内容详见洲阁2015年的集训队论文。这里我就大致口胡一下,求一个积性函数的前缀和可以把它狄利克雷卷积上另一个函数,同时卷上的这个函数和卷完得到的这个函数如果都很好求前缀和的话,那么就可以用杜教筛来求。phi函数大致的推导如下:

Code

 #include <cstdio>
#include <map> #define R register
#define maxn 2000010
typedef long long ll;
int phi[maxn], miu[maxn], pr[maxn / ], prcnt;
ll sph[maxn], smi[maxn];
bool vis[maxn];
const int moha = ;
struct Hash {
Hash *next;
int ps; ll ans;
} *last1[moha], *last2[moha], mem[moha], *tot = mem;
inline ll S1(R int n)
{
if (n < maxn) return sph[n];
for (R Hash *iter = last1[n % moha]; iter; iter = iter -> next)
if (iter -> ps == n) return iter -> ans; R ll ret = 1ll * n * (n + 1ll) / ;
for (R ll i = , j; i <= n; i = j + )
{
j = n / (n / i);
ret -= S1(n / i) * (j - i + );
}
*++tot = (Hash) {last1[n % moha], n, ret}; last1[n % moha] = tot;
return ret;
}
inline ll S2(R int n)
{
if (n < maxn) return smi[n];
for (R Hash *iter = last2[n % moha]; iter; iter = iter -> next)
if (iter -> ps == n) return iter -> ans; R ll ret = ;
for (R ll i = , j; i <= n; i = j + )
{
j = n / (n / i);
ret -= (j - i + ) * S2(n / i);
}
*++tot = (Hash) {last2[n % moha], n, ret}; last2[n % moha] = tot;
return ret;
}
int main()
{
R int T; scanf("%d", &T);
phi[] = sph[] = ;
miu[] = smi[] = ;
for (R int i = ; i < maxn; ++i)
{
if (!vis[i]) pr[++prcnt] = i, phi[i] = i - , miu[i] = -;
sph[i] = sph[i - ] + phi[i];
smi[i] = smi[i - ] + miu[i];
for (R int j = ; j <= prcnt && 1ll * i * pr[j] < maxn; ++j)
{
vis[i * pr[j]] = ;
if (i % pr[j])
{
phi[i * pr[j]] = phi[i] * (pr[j] - );
miu[i * pr[j]] = -miu[i];
}
else
{
phi[i * pr[j]] = phi[i] * pr[j];
miu[i * pr[j]] = ;
break;
}
}
}
for (; T; --T)
{
R int N; scanf("%d", &N);
// printf("%d\n", N);
printf("%lld %lld\n", S1(N), S2(N));
}
return ;
}
/*
6
1
2
8
13
30
2333
*/

【BZOJ3944】 Sum的更多相关文章

  1. 【BZOJ3944】Sum(杜教筛)

    [BZOJ3944]Sum(杜教筛) 题面 求\[\sum_{i=1}^n\mu(i)和\sum_{i=1}^n\phi(i)\] 范围:\(n<2^{31}\) 令\[S(n)=\sum_{i ...

  2. 【BZOJ3944】Sum

    题面 Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1, ...

  3. 【CF914G】Sum the Fibonacci 快速??变换模板

    [CF914G]Sum the Fibonacci 题解:给你一个长度为n的数组s.定义五元组(a,b,c,d,e)是合法的当且仅当: 1. $1\le a,b,c,d,e\le n$2. $(s_a ...

  4. 【BZOJ4262】Sum 单调栈+线段树

    [BZOJ4262]Sum Description Input 第一行一个数 t,表示询问组数. 第一行一个数 t,表示询问组数. 接下来 t 行,每行四个数 l_1, r_1, l_2, r_2. ...

  5. 【POJ1707】【伯努利数】Sum of powers

    Description A young schoolboy would like to calculate the sum for some fixed natural k and different ...

  6. 【loj6059】Sum

    Portal --> loj6059 Solution ​​ 看过去第一反应是..大力数位dp!然后看了一眼数据范围... ​ 但是这没有什么关系!注意到我们不需要考虑前导零了,可以直接快乐dp ...

  7. 【leetcode】Sum Root to Leaf Numbers(hard)

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  8. 【LeetCode】Sum of Two Integers

    问题描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and - ...

  9. 【POJ2739】Sum of Consecutive Prime Numbers

    简单的素数打表,然后枚举.开始没注意n读到0结束,TLE了回..下次再认真点.A过后讨论里面有个暴力打表过的,给跪了! #include <iostream> #include <c ...

随机推荐

  1. 【转帖】Linux上,最常用的一批命令解析(10年精选)

    Linux上,最常用的一批命令解析(10年精选) https://juejin.im/post/5d134fbfe51d4510727c80d1 写的挺好呢 Linux这么多命令,通常会让初学者望而生 ...

  2. TCP/IP 物理层卷四 -- 数据报与虚电路

    一.数据报(Datagram) 1.1 概念 数据报是分组交换的一种,主要向通信子网中的端系统提供无连接的分组交换服务.通信子网的某主机发送一个报文时,无需建立连接,只需在实现高层协议的前提下对数据拆 ...

  3. SqlServer中union 和 union all的区别

    ⒈UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同.⒉对重复结果的处理:UNION在进行表链接后会筛选掉重复的数据,UNION ALL不会去除重复的 ...

  4. python线程的几种创建方式

    Python3 线程中常用的两个模块为: _thread threading(推荐使用) 使用Thread类创建 import threading from time import sleep,cti ...

  5. PB中的DataStore的应用示例

    编程过程中想在窗口中加一个下拉列表(DDLB),原来听同学说过可以动态改变下拉列表的值,数据库中的表改变,前台客户端的下拉列表就会变,记得当时同学说的是用一个叫下拉数据窗口(DDDW)的东西做的,一直 ...

  6. ASP.Net Core下Authorization的几种方式 - 简书

    原文:ASP.Net Core下Authorization的几种方式 - 简书 ASP.Net Core下Authorization的几种方式 Authorization其目标就是验证Http请求能否 ...

  7. 剑指offer-和为S的两个数字-知识迁移能力-python

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...

  8. 给Repater增加等号

    //不改变数据结构的情况下,增加行号.对Application服务器压力增大,减少DB服务器压力.    protected void repShow_ItemDataBound(object sen ...

  9. Mac下的Web性能压力测试工具:ab(ApacheBench)

    Web开发,少不了的就是压力测试,它是评估一个产品是否合格上线的基本标准. ab是一种用于测试Apache超文本传输协议(HTTP)服务器的工具.apache自带ab工具,可以测试Apache.IIS ...

  10. pytorch中的torch.repeat()函数与numpy.tile()

    repeat(*sizes) → Tensor Repeats this tensor along the specified dimensions. Unlike expand(), this fu ...