\(\text{Solution}\)

首先把 \(T2\) 给切了,\(T1\) 找半天规律找不到

然后打了个表算是暴力了

\(T3\) 也暴。。。

太暴了。。。

\(T4\) 直接啥也不会

\(\text{T1}\)

考虑一个 \(a\) 的答案

\((c+b)(c-b)=a^2\) 或 \((c+b)(c-b)=(a+1)(a-1)\) 的 \(c,b\) 组数

就是一般的分类讨论了,记一个数 \(a\) 的答案为 \(f(a)\),\(d(a)\) 为 \(a\) 的约数个数

那么 \(2\nmid a,f(a)=d(a)/2\)

\(4\mid a,f(a)=d(a/4)/2\)

其余则为 \(0\)

具体考虑 \(a^2\) 和 \(a^2-1\) 的 \(f\) 值即可

\(\text{Code}\)

#include <cstdio>
#define RE register
using namespace std;
typedef long long LL; const int N = 1e7 + 5;
int x, y, d[N], _d[N], num[N], tot, pr[N / 10], vis[N], ans; void Sieve()
{
d[1] = _d[1] = num[1] = 1;
for(RE int i = 2; i <= 1e7 + 3; i++)
{
if (!vis[i]) pr[++tot] = i, d[i] = 2, num[i] = 1, _d[i] = 3;
for(RE int j = 1, z; j <= tot && pr[j] * i <= 1e7 + 3; j++)
{
vis[z = i * pr[j]] = 1;
if (i % pr[j] == 0)
{
num[z] = num[i] + 1, d[z] = d[i] / num[z] * (num[z] + 1);
_d[z] = _d[i] / (num[i] * 2 + 1) * (num[z] * 2 + 1);
break;
}
else d[z] = d[i] * 2, num[z] = 1, _d[z] = _d[i] * 3;
}
}
} int main()
{
Sieve(), scanf("%d%d", &x, &y);
for(RE int a = x; a <= y; a++)
if (a & 1) ans += (LL)_d[a] / 2 + (LL)d[(a + 1) / 2] * d[(a - 1) / 2] / 2;
else ans += (LL)d[a + 1] * d[a - 1] / 2 + _d[a / 2] / 2;
printf("%d\n", ans);
}

\(\text{T2}\)

一眼分位变成线段树赋值和异或操作

\(\text{Code}\)

#include <cstdio>
#define RE register
#define IN inline
using namespace std; const int N = 5e4 + 5, LG = 9, SZ = N * 4, M = LG + 2;
int n, m, a[N]; struct SegmenTree{
#define ls (p << 1)
#define rs (ls | 1)
int sum[SZ][M], tg1[SZ][M], tg2[SZ][M];
IN void pushup(int p, int k){sum[p][k] = sum[ls][k] + sum[rs][k];}
void build(int p, int l, int r)
{
for(RE int j = 0; j <= LG; j++) tg1[p][j] = -1;
if (l == r)
{
for(RE int j = 0; j <= LG; j++) sum[p][j] = ((a[l] >> j) & 1);
return;
}
int mid = l + r >> 1; build(ls, l, mid), build(rs, mid + 1, r);
for(RE int j = 0; j <= LG; j++) pushup(p, j);
}
IN void push(int p, int k, int z, int l, int r)
{
if (z == 0 || z == 1) sum[p][k] = z * (r - l + 1), tg1[p][k] = z;
else{
sum[p][k] = r - l + 1 - sum[p][k], tg2[p][k] ^= 1;
if (tg1[p][k] != -1) tg1[p][k] ^= 1;
}
}
IN void pushdown(int p, int k, int l, int r)
{
int mid = l + r >> 1;
if (tg2[p][k]) push(ls, k, 2, l, mid), push(rs, k, 2, mid + 1, r), tg2[p][k] = 0;
if (tg1[p][k] != -1) push(ls, k, tg1[p][k], l, mid), push(rs, k, tg1[p][k], mid + 1, r), tg1[p][k] = -1;
}
void assign(int p, int l, int r, int k, int x, int y, int z)
{
if (x > r || y < l) return;
if (x <= l && r <= y) return push(p, k, z, l, r), void();
pushdown(p, k, l, r); int mid = l + r >> 1;
if (x <= mid) assign(ls, l, mid, k, x, y, z);
if (y > mid) assign(rs, mid + 1, r, k, x, y, z);
pushup(p, k);
}
void reverse(int p, int l, int r, int k, int x, int y)
{
if (x > r || y < l) return;
if (x <= l && r <= y) return push(p, k, 2, l, r), void();
pushdown(p, k, l, r); int mid = l + r >> 1;
if (x <= mid) reverse(ls, l, mid, k, x, y);
if (y > mid) reverse(rs, mid + 1, r, k, x, y);
pushup(p, k);
}
int Query(int p, int l, int r, int k, int x, int y)
{
if (x > r || y < l) return 0;
if (x <= l && r <= y) return sum[p][k];
pushdown(p, k, l, r); int mid = l + r >> 1, res = 0;
if (x <= mid) res = Query(ls, l, mid, k, x, y);
if (y > mid) res += Query(rs, mid + 1, r, k, x, y);
return res;
}
}T; int main()
{
scanf("%d%d", &n, &m);
for(RE int i = 1; i <= n; i++) scanf("%d", &a[i]);
T.build(1, 1, n); char op[10];
for(RE int l, r, x; m; --m)
{
scanf("%s%d%d", op, &l, &r);
if (op[0] == 'a'){
scanf("%d", &x);
for(RE int j = 0; j <= LG; j++) if (!((x >> j) & 1)) T.assign(1, 1, n, j, l, r, 0);
}
else if (op[0] == 'o'){
scanf("%d", &x);
for(RE int j = 0; j <= LG; j++) if ((x >> j) & 1) T.assign(1, 1, n, j, l, r, 1);
}
else if (op[0] == 'x'){
scanf("%d", &x);
for(RE int j = 0; j <= LG; j++) if ((x >> j) & 1) T.reverse(1, 1, n, j, l, r);
}
else if (op[1] == 'x'){
int res = 0, z;
for(RE int j = 0; j <= LG; j++) z = T.Query(1, 1, n, j, l, r), res += ((z & 1) ? (1 << j) : 0);
printf("%d\n", res);
}
else{
int res = 0, z;
for(RE int j = 0; j <= LG; j++) z = T.Query(1, 1, n, j, l, r), res += z * (1 << j);
printf("%d\n", res);
}
}
}

最新文章

  1. iOS开发小技巧--微博项目中的键盘工具条
  2. 学会Git玩转Github
  3. nmap的script参数列表
  4. C#: enum
  5. MySql 去重且指定某字段在前的排序方法
  6. Python 结巴分词(2)关键字提取
  7. 事件类型: 错误 事件来源: Service Control Manager 事件种类: 无 事件 ID: 7000
  8. HDU-4665 Unshuffle 搜索 | 2-SAT
  9. js数据转换
  10. iptables原理详解以及功能说明
  11. EL表达式遍历Map集合
  12. electron应用以管理员权限启动
  13. 对国内AR产业的预言
  14. 网络操作基础(one)
  15. sqlite 使用 cte 及 递归的实现示例
  16. string 与 stringbuilder效率相差很大
  17. vue的单向数据流
  18. spring boot(二): spring boot+jdbctemplate+sql server
  19. The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured
  20. 【iCore1S 双核心板_ARM】例程二:读取ARM按键状态

热门文章

  1. 《HelloGitHub》第 80 期
  2. 生成requirements.txt
  3. Entity Framework Core 7中高效地进行批量数据插入
  4. labuladong算法笔记总结
  5. python Modbus 进行通讯时抛出Modbus Error: Exception code = 2
  6. jquerylib表单
  7. screenfetch—最炫酷的查看你的设备信息
  8. Hadoop详解(02)Hadoop集群运行环境搭建
  9. python之路51 聚合查询 分组查询
  10. awk 入门