题解 | #求和#
求和
https://ac.nowcoder.com/acm/problem/53631
玄学做法:
打表找规律:
名称 | 缩写 |
---|---|
1 | |
3 | |
8 | |
20 | |
48 | |
... | ... |
根据递推公式:
可以得到:
逻辑做法:
注:表示二进制写法,1后面有n个0
对于,最终目标是。对于相当于二进制从加到,那么
表示出来就可以得到
AC代码
#include <bits/stdc++.h>
#define end '\n'
using namespace std;
const long long mod = 998244353;
inline void IOS()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
}
long long qpow(long long a, long long b)
{
long long ans = 1;
if(b<0)
return 1;
while (b)
{
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
unsigned long long n;
void dilingtian()
{
__int128 ans = ((__int128)qpow(2, n - 1) * (__int128)n % (__int128)mod + (__int128)qpow(2, n)) % (__int128)mod;
printf("%lld\n", (int)ans);
}
int main(void)
{
// IOS();
long long t;
scanf("%lld",&t);
while (t--)
{
scanf("%lld", &n);
dilingtian();
}
return 0;
}