import java.util.Scanner;
public class Main {
public static void main(String[] arg) {
Scanner scanner = new Scanner(System.in);
// todo
}
}
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 longusing 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_cachefrom sys import stdininput = stdin.readlinemod = 998244353@lru_cache(None)def f(n: int):res = nif n == 1:return 1if res >= mod:res -= modm = (n + 1) // 2if m > 1:res += f(m)if res >= mod:res -= modres += f(n - m)if res >= mod:res -= modreturn resfor _ 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 cachefrom sys import stdininput = stdin.readlinemod=998244353@cachedef dp(n:int):time=nif n==1:return 1if time>=mod:time-=modm=(1+n)//2if m>1:time+=dp(m)if time>=mod: time-=modtime+=dp(n-m)if time >= mod: time -= modreturn timefor _ in range(int(input())):k=int(input())print(dp(k)*pow(k,mod-2,mod)%mod)