目录

[ABC283Ex] Popcount Sum

我的社区http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=3svdDJTlkD76TRRShbxYCYK1zK1c8cyF&authKey=v1pxp6rS8AA4SRy7bflJl9LIwp8d5v0HOudw%2BDxHiWDRqZ1LzjeoBJH1Z1EXnl35&noverify=0&group_code=546881376

[ABC283Ex] Popcount Sum

题面翻译

记 popcount ( n ) \text{popcount}(n) popcount(n) 为 n n n 的二进制表示中 1 1 1 的个数。

现在有 T T T 组询问,每组询问给定 n , m , r n, m, r n,m,r,请求出
∑ i   m o d   m = r n popcount ( i ) \sum_{i\bmod m = r}^n \text{popcount}(i) imodm=r∑npopcount(i)

即小于等于 n n n 且模 m m m 为 r r r 的正整数的 popcount \text{popcount} popcount 之和。

1 ≤ T ≤ 1 0 5 , 1 ≤ m ≤ n ≤ 1 0 9 , 0 ≤ r < m 1\le T \le 10^5,\ 1\le m \le n \le 10^9,\ 0\le r < m 1≤T≤105, 1≤m≤n≤109, 0≤r<m。

题目描述

1 1 以上 N N 以下の整数であって、M M で割った余りが R R になるものすべてに対する popcount の総和を求めてください。

ただし、正整数 X X に対して X X の popcount とは X X を二進表記したときの 1 1 の個数、すなわち 2kˆ 2\^k の位が 1 1 となる非負整数 k k の個数のことです。

1 1 つの入力につき、 T T 個のテストケースに答えてください。

输入格式

入力は以下の形式で標準入力から与えられる。入力の 1 1 行目は以下の通りである。

T T

そして、T T 個のテストケースが続く。これらはそれぞれ以下の形式で与えられる。

N N M M R R

输出格式

T T 行出力せよ。i i 行目には i i 番目のテストケースに対する答えを出力せよ。

样例 #1

样例输入 #1

复制代码
2
12 5 1
6 1 0

样例输出 #1

复制代码
6
9

提示

制約

  • 1leqTleq105ˆ 1\\ \\leq\\ T\\ \\leq\\ 10\^5
  • 1leqMleqNleq109ˆ 1\\ \\leq\\ M\\ \\leq\\ N\\ \\leq\\ 10\^9
  • 0leqR\<M 0\\ \\leq\\ R\\ \<\\ M
  • 入力はすべて整数

Sample Explanation 1

1 1 つ目のテストケースでは、1 1 の popcount が 1、、、6 1 、 、 、 6 の popcount が 2、、、11 2 、 、 、 11 の popcount が 3 3 であるため 1+2+3 1+2+3 の計算結果である 6 6 を出力します。 2 2 つ目のテストケースでは、1 1 の popcount が 1、、、2 1 、 、 、 2 の popcount が 1、、、3 1 、 、 、 3 の popcount が 2、、、4 2 、 、 、 4 の popcount が 1、、、5 1 、 、 、 5 の popcount が 2、、、6 2 、 、 、 6 の popcount が 2 2 であるため 1+1+2+1+2+2 1+1+2+1+2+2 の計算結果である 9 9 を出力します。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mian(ll a,ll b,ll c,ll n) 
{
    if (n<0) return 0;
    if (!a||!n) return b/c*(n+1);
    if (a>=c||b>=c) return n*(n+1)*(a/c)/2+(n+1)*(b/c)+mian(a%c,b%c,c,n);
    return(a*n+b)/c*n-mian(c,c-b-1,a,(a*n+b)/c-1);
}
int t;ll n,m,r;
int main()
{
	cin>>t;
	while(t--) 
    {
		scanf("%lld%lld%lld",&n,&m,&r);
		ll ans=0;
		for(ll i=1;i<=n;i<<=1) ans+=mian(m,r+i,i*2,(n-r)/m)-mian(m,r,i*2,(n-r)/m);
		printf("%lld\n",ans);
	}
	return 0;
}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
褚翾澜4 分钟前
Ruby语言的代码重构
开发语言·后端·golang
肠胃炎7 分钟前
真题246—矩阵计数
java·线性代数·算法·矩阵·深度优先
什码情况8 分钟前
微服务集成测试 -华为OD机试真题(A卷、JavaScript)
javascript·数据结构·算法·华为od·机试
罗西的思考2 小时前
[2W字长文] 探秘Transformer系列之(23)--- 长度外推
人工智能·算法
算AI21 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55521 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄21 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
懒羊羊大王&1 天前
模版进阶(沉淀中)
c++
无名之逆1 天前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔1 天前
【C语言】文件操作
c语言·开发语言