NC253623. Kevin逛超市
描述
输入描述
第一行包含一个整数 ,表示测试用例的组数。
对于每组测试用例:
仅输入一行,包含一个整数 ,表示物品的数量。保证 。
输出描述
对于每组测试用例:
仅输出一行,包含一个整数,表示答案。
示例1
输入:
3 1 2 3
输出:
1 499122178 332748120
说明:
对于第一组测试用例:C++(clang++ 11.0.1) 解法, 执行用时: 895ms, 内存消耗: 106796K, 提交时间: 2023-07-14 22:11:43
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 2e6+5; const int mod = 998244353; unordered_map<int,int>mp; int qpow(int a,int b){ int res=1; while(b){ if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } int dfs(int n){ if(mp.count(n)) return mp[n]; int m=(1+n)>>1; return mp[n]=(dfs(m)+dfs(n-m)+n)%mod; } signed main(void){ ios::sync_with_stdio(false);cin.tie(0); mp[1]=1; mp[2]=3; int T=1; cin>>T; while(T--){ int n; cin>>n; cout<<dfs(n)*qpow(n,mod-2)%mod<<"\n"; } return 0; }
pypy3 解法, 执行用时: 1842ms, 内存消耗: 193556K, 提交时间: 2023-07-14 22:54:57
from functools import lru_cache from sys import stdin input = stdin.readline mod = 998244353 @lru_cache(None) def f(n: int): res = n if n == 1: return 1 if res >= mod: res -= mod m = (n + 1) // 2 if m > 1: res += f(m) if res >= mod: res -= mod res += f(n - m) if res >= mod: res -= mod return res for _ in range(int(input())): n = int(input()) print(f(n) * pow(n, mod - 2, mod) % mod)
Python3 解法, 执行用时: 3870ms, 内存消耗: 241736K, 提交时间: 2023-07-20 20:59:30
from functools import cache from sys import stdin input = stdin.readline mod=998244353 @cache def dp(n:int): time=n if n==1:return 1 if time>=mod:time-=mod m=(1+n)//2 if m>1: time+=dp(m) if time>=mod: time-=mod time+=dp(n-m) if time >= mod: time -= mod return time for _ in range(int(input())): k=int(input()) print(dp(k)*pow(k,mod-2,mod)%mod)