题意

题解

Step 1

把原式进行了最基本的变换,把 i 移到右边,并先枚举 j ,这里 i 从 0 开始枚举,并不影响答案,因为 C(j,0) 乘 0 后没有影响,但是这样方便后面的推导

Step 2

因为

这是最基本的组合数性质,所以把右边一坨加上自己的变式,再除以2

Step 3

把右上角换元,用 j - i 替换 i

Step 4

换元后,发现两坨可以合并,把同类项的系数加起来恰好等于 j

Step 5

因为

这也是组合数的性质之一,用组合意义可以解释为“从n个球中依次选0,1,2,...个的方案数之和就相当于每个数可以选与不选,也就是2^n”

所以就可以少枚举一层了。

我看这个式子后,想出了矩阵加速的解法

一个3*1的向量矩阵乘3*3的转移矩阵,向量里依次维护2^(j-1)、j * 2^(j-1)、sum。

转移矩阵也很好推,码码码……

……(Time Limit Exceeded)……

事后我算了一下复杂度,最大为O(300000*64*27)=O(518400000),好像过不了,只好继续推式子

Step 6

把 ×j 换成 ×[ (n + 1) - (n + 1 - j) ],然后分开,右边就相当于这样一个数

Step 7

(这一步可能难懂,请读者感性理解)

把Step 6里右边那个数拆开,

先设该数为 n 个数相加,n 个数初始为零

把 n×(1) 拆成 n 个 (1) 相加,然后依次加到 n 个数中

再把 (n-1)×(10) 拆成 n-1 个 (10) 相加,然后依次加到后 n-1 个数中

再把 (n-2)×(100) 拆成 n-2 个 (100) 相加,然后依次加到后 n-2 个数中

……

最后再把这 n 个数相加,发现

Step 8

把 2^j-1 的 1 提出来,直接在右边+n,顿时变得清爽

Step 9

这步是把它二进制展开,左边有n个连续的1,右边一个0,可以通过更高一位的 1 减去 (10) 得到

大功告成,可以直接用快速幂了!

Step 10

这步其实没什么必要,只是笔者想到可以(凑个整数)用欧拉定理优化,于是就用了,最大数据可以把常数除以 2

CODE

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#define MAXN 505
#define MAXM 35
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x)&(x))
//#define int LL
using namespace std;
inline LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + (s - '0');s = getchar();}
return x * f;
}
const int jzm = 1000000007;
int n,m,i,j,s,o,k;
int qkpow(int a,LL b,int zxy) {
int res = 1;
while(b > 0) {
if(b & 1) res = res *1ll* a % zxy;
a = a *1ll* a % zxy;
b >>= 1;
}
return res % zxy;
}
int main() {
LL N;
while(scanf("%lld",&N) == 1) {
int ans = (qkpow(2,N % (jzm-1),jzm) + (jzm-1)) % jzm *1ll* (N%jzm + 1ll) % jzm;
ans = (ans +0ll+jzm - qkpow(2,(N+1) % (jzm-1),jzm)) % jzm;
(ans += (N+2ll) % jzm) %= jzm;
printf("%d\n",ans);
}
return 0;
}

HDU 6467 简单数学题 (组合数学推导)的更多相关文章

  1. HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    M ...

  2. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. HDU 1220 简单数学题

    题目大意是 在魔方上找到有多少对小立方块它们之间连接的点不超过两个 因为任意两个立方块之间相连的点就只有0,1,2,4 这样4种情况 那么我们只需要考虑总共的组成立方块对数 sum = C(2 , n ...

  4. JZOJ 5773. 【NOIP2008模拟】简单数学题

    5773. [NOIP2008模拟]简单数学题 (File IO): input:math.in output:math.out Time Limits: 1000 ms  Memory Limits ...

  5. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  6. Discrete Function(简单数学题)

    Discrete Function There is a discrete function. It is specified for integer arguments from 1 to N (2 ...

  7. [JZOJ5773]【NOIP2008模拟】简单数学题

    Description       话说, 小X是个数学大佬,他喜欢做数学题.有一天,小X想考一考小Y.他问了小Y一道数学题.题目如下:      对于一个正整数N,存在一个正整数T(0<T&l ...

  8. HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  9. hdu 2964 Prime Bases(简单数学题)

    按照题意的要求逐渐求解: #include<stdio.h> #include<string.h> #include<algorithm> using namesp ...

随机推荐

  1. 【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析

    一.文档存储的需求 很多的开发者都使用过mongodb,在mongodb中数据记录是以文档的形式存在的(类似于一种多级嵌套SQL的形式).比如下面的JSON数据结构:dev_ip表示某一台服务器的ip ...

  2. 第六章、PXE高效网络装机、Kickstart无人值守安装

    目录 一.部署PXE远程安装服务 1PXE定义 2PXE服务优点 3搭建网络体系前提条件 4PXE实现过程讲解 二.搭建PXE远程安装服务器 三.Kickstart无人值守安装 一.部署PXE远程安装 ...

  3. 使用vue实现排序算法演示动画

    缘起 最近做的一个小需求涉及到排序,界面如下所示: 因为项目是使用vue的,所以实现方式很简单,视图部分不用管,本质上就是操作数组,代码如下: { // 上移 moveUp (i) { // 把位置i ...

  4. 如何手动解析vue单文件并预览?

    开头 笔者之前的文章里介绍过一个代码在线编辑预览工具的实现(传送门:快速搭建一个代码在线编辑预览工具),实现了css.html.js的编辑,但是对于demo场景来说,vue单文件也是一个比较好的代码组 ...

  5. 7 个有趣的 Python 实战项目,超级适合练手

    关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...

  6. 单片机 MCU 固件打包脚本软件

    ​ 1 前言 开发完 MCU 软件后,通常都会生成 hex 文件或者 bin 文件,用来做固件烧录或者升级,如果用来做产品开发,就涉及到固件版本的问题,初学者通常采用固件文件重命名来区分版本. 如果需 ...

  7. Java 常用Set集合和常用Map集合

    目录 常用Set集合 Set集合的特点 HashSet 创建对象 常用方法 遍历 常用Map集合 Map集合的概述 HashMap 创建对象 常用方法 遍历 HashMap的key去重原理 常用Set ...

  8. CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解

    前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...

  9. SQL练习六--More JOIN operations

    movie Field name Type Notes id INTEGER An arbitrary unique identifier title CHAR(70) The name of the ...

  10. Fibonacci Nim

    目录 题意 题解 相关 Ref 题意 [COCI2010-2011#4] HRPA 取石子,但是: 先手第一次可取任意多个石子 此外每次可取的石子的个数,至少为 \(1\) ,至多为上一轮对方所取个数 ...