列表

详情


NC53631. 求和

描述

小a学习了树状数组之后,对很感兴趣,于是出了一道题。
给定非负整数n。记为x的二进制表示下最低位的1所对应的值,如,某个数x最低位的1分别在第1,2,3位时,分别是1,2,4。求
输出答案对998244353取模后的结果。T组数据。

输入描述

第一行一个整数T,表示数据组数。
接下来T行每行一个整数n,含义如题目描述所示。

输出描述

输出T行,表示每次询问的结果。

示例1

输入:

2
2
4

输出:

8
48

说明:

n=2时,Ans=\sum_{i=0}^{4}\text{lowbit}(i)=0+1+2+1+4=8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 411ms, 内存消耗: 3212K, 提交时间: 2019-12-09 22:12:42

#include<stdio.h>
inline int FP(int x,long long k)
{
    int t=1;
    for(; k; k>>=1,x=1ll*x*x%998244353)
        if(k&1) t=1ll*t*x%998244353;
    return t;
}
main()
{
	int m,t;
	scanf("%d",&t);
	long long i,n,sum;
	for(m=0;m<t;m++)
	{
		scanf("%lld",&n);
		if(n==0)printf("1\n");
		else 
		{
			sum=(n%998244353*FP(2,n-1)+FP(2,n))%998244353;
			printf("%lld\n",sum);
		}
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 244ms, 内存消耗: 8068K, 提交时间: 2019-11-15 22:44:42

#include<bits/stdc++.h>
#define p 998244353
using namespace std;
typedef long long ll;
ll qsm(ll x,ll y){
	ll ret=1ll;
	while (y){
		if (y&1) ret=ret*x%p;
		x=x*x%p,y>>=1;
	}
	return ret;
}
ll T,n,ans,s,k;
int main(){
	s=qsm(2,p-2);
	scanf("%d",&T);
	while (T--){
		scanf("%lld",&n);
		k=(n+2)%p;
		ans=k*s%p;
		ans=ans*qsm(2,n)%p;
		printf("%lld\n",ans);
	}
}

C++14(g++5.4) 解法, 执行用时: 304ms, 内存消耗: 3300K, 提交时间: 2019-11-15 20:14:04

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 998244353;
ll ksm(ll a,ll b,ll c)
{
	ll ans=1;
	while(b)
	{
		if(b%2) ans=ans*a%c;
		b/=2;
		a=a*a%c;
	}
	return ans;
}
int main()
{
	ll t,n;
	cin>>t;
	while(t--)
	{
		scanf("%lld",&n);
		printf("%lld\n",((n%mod*ksm(2,n-1,mod)%mod)+(ksm(2,n,mod)%mod))%mod);
	}
	
}

pypy3(pypy3.6.1) 解法, 执行用时: 2150ms, 内存消耗: 30680K, 提交时间: 2019-11-15 20:28:50

def ksm(b, e, m):
    result = 1
    e %= (m-1)
    while e != 0:
        if (e&1) == 1:
            result = (result * b) % m
        e >>= 1
        b = (b*b) % m
    return result

n = int (input())
while n > 0 :
    n-=1
    m = int (input())
    ans = (ksm(2, m, 998244353) + ksm(2, m-1, 998244353) * m) %  998244353
    print(ans)

Python3(3.5.2) 解法, 执行用时: 3560ms, 内存消耗: 6260K, 提交时间: 2019-11-16 16:28:33

T = int(input())
while T:
    T -= 1
    n = int(input())
    if n == 0:
        print(1)
        continue
    print((n+2)*pow(2, n-1, 998244353)%998244353)

上一题