首页 > 其他分享 >P7976 解题报告

P7976 解题报告

时间:2024-09-11 17:18:25浏览次数:12  
标签:right limits 报告 int P7976 解题 choose ll left

题目传送门

题目大意:

设函数 \(F(x) := (x + 1) \bmod 3 − 1\),\(T\) 次询问,计算:

\[\sum\limits_{i = 0}^{n}\sum\limits_{j}F\left({i\choose j}\right) \]

思路:

看到奇奇怪怪的组合数求和首先考虑 \(\text{Lucas}\),将原数在 \(3\) 进制下拆位,得:

\[{i\choose j} = \prod\limits_{k = 1}^{m}{i_k\choose j_k}\bmod 3 \]

其中 \(m\) 表示 \(i\) 和三进制下较长的那个数的数字位数。

接着注意到 \(F\) 函数是一个积性函数(这个可以分九类讨论证明),即 \(F(xy) = F(x)F(y)\),所以实际上 \(F\left({i\choose j}\right)\) 要计算的就是所有 \(F\left({i_k\choose j_k}\right)\) 的乘积。

对于每一个 \(i\),\(j\) 的每一位就独立了,这时候再分类讨论:

  1. 当 \(i_k = 0\) 时,\(j_k\) 取 \(0\) 的时候有贡献,此时这一位的值为 \(F(1) = 1\);
  2. 当 \(i_k = 1\) 时,\(j_k\) 取 \(0,1\) 的时候有贡献,此时这一位的值为 \(F(1) + F(1) = 2\);
  3. 当 \(i_k = 2\) 时,\(j_k\) 取 \(0,1,2\) 的时候有贡献,此时这一位的值为 \(F(1) + F(2) + F(1) = 1\)。

而乘 \(1\) 是不会是答案增加的,所以只用考虑乘 \(2\) 的个数就行了,即:

\[\sum\limits_{j}F\left(i\choose j\right) = \left(\prod\limits_{i_k = 0}1\right)\left(\prod\limits_{i_k = 1}2\right)\left(\prod\limits_{i_k = 2}1\right) = 2^{\#\{i_k = 1\}} \]

然后就会发现统计一下三进制表示下 \(1\) 的个数就行了,数位 dp 即可。

\(\texttt{Code:}\)

#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;

const int N = 65, mod = 1732073999;

int T;
ll vmax, n;
vector<int> num;
ll f[N][N];

ll qpow(int a, int b) {
    ll ans = 1, base = a;
    while(b) {
        if(b & 1) ans = ans * base % mod;
        base = base * base % mod;
        b >>= 1;
    }
    return ans;
}

ll dfs(int pos, int cnt, bool limit, bool zero) {
    if(pos < 0) return qpow(2, cnt);
    if(!limit && !zero && ~f[pos][cnt]) return f[pos][cnt];
    int mx = (limit ? num[pos] : 2);
    ll res = 0;
    for(int i = 0; i <= mx; i++)
        res = (res + dfs(pos - 1, cnt + (i == 1), limit && (i == num[pos]), zero && (!i))) % mod;
    if(!limit && !zero) f[pos][cnt] = res;
    return res;
}

ll calc(ll x) {
    num.clear();
    ll tmp = x;
    while(tmp) {
        num.push_back(tmp % 3);
        tmp /= 3;
    }
    return dfs(num.size() - 1, 0, 1, 1);
}

int main() {
    scanf("%d%lld", &T, &vmax);
    memset(f, -1, sizeof f);
    while(T--) {
        scanf("%lld", &n);
        printf("%lld\n", calc(n));
    }
    return 0;
}

标签:right,limits,报告,int,P7976,解题,choose,ll,left
From: https://www.cnblogs.com/Brilliant11001/p/18408547

相关文章

  • 基于OpenSSL的密码管理系统-应用密码学课程报告
    第1章概要设计1.1设计目的本研究旨在设计并实现一个基于OpenSSL的密码管理系统,该系统具备密钥对的生成、密钥上传、密钥的核对、身份认证、文件与邮件的加密和解密、数字签名及数字证书管理等常用功能。研究的意义主要体现在以下几个方面:提升网络信息安全水平:通过集成多种密......
  • CTF学习-MISC杂项解题思路
    文件操作与隐写文件类型识别 1.File命令当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件。使用场景:不知道后缀名,无法打开文件。格式:filemyheart2.winhex通过winhex.程序中可以查看文件头类型,根据文件头类型判断出......
  • 井下甲烷气体报警器研发(工程教育课程项目报告)
    目录井下甲烷气体报警器研发......................................................................................3一、   项目概况..............................................................................................31.    项目内容...........
  • 【看雪-注册安全分析报告】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机器学习能力提......
  • 软件项目管理资料总汇(规格说明书;详细设计;测试计划;验收报告)
      前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是各个阶段的文档资料概述:软件项目管理部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调......
  • 【专题】2024年中国折叠屏手机市场与消费趋势研究报告合集PDF分享(附原数据表
    原文链接:https://tecdat.cn/?p=37645中国智能手机市场目前仍处于整体增长瓶颈期,增长复苏未达预期,消费者换机预期周期不断延长,使得行业对破局点的探寻更为紧迫。与此同时,中端消费者购机呈现出消费降级与升级的分化态势,不过更多人会选择体验更好、配置更优的产品以延长使用时间。ID......
  • 数据结构实验报告1(集合)
    学习目标:        掌握抽象数据类型的表示与实现方法。学习内容:        描述一个集合的抽象数据类型ASet,其中所有元素为整数且所有元素不相同,集合的基本操作包括:由整数数组a[0..n-1]创建一个集合。输出集合中的所有元素。判断一个元素是否在一个集合中。求......
  • 基于django+vueblockly少儿编程在线学习网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,编程教育逐渐从高等教育向基础教育渗透,成为培养未来社会创新人才的重要途径。少儿编程作为这一趋势的前沿阵地,其重......
  • 基于django+vueATM自动取款机系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和金融服务的日益普及,自动取款机(ATM)系统已成为现代银行服务不可或缺的一部分。ATM系统不仅极大地提升了金融交易的......
  • 使用SVM在数字验证码识别中的应用研究课程报告
    第1章概要设计1.1设计目的支持向量机作为一类强大的监督学习模型,以其出色的泛化能力,在手写数字识别、面部检测、图像分类等多个领域展现出了其优越性。其在处理小样本、非线性及高维模式识别任务中表现尤为突出。SVM通过构造最优超平面,在保证分类准确性的同时,最大限度地提高了......