题意

题解

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. 为什么 SQL 语句使用了索引,但却还是慢查询?

    一.索引与慢查询 聊一聊索引和慢查询,经常遇到的一个问题:一个SQL语句使用了索引,为什么还是会记录到慢查询日志之中? 为了说明,创建一个表t,该表3个字段,一个主键索引,一个普通索引 CREATE ...

  2. 入坑KeePass(三)安全设置完后后留存

    1.文件> 数据库设置 > 安全 迭代次数改成500000 2.工具 > 选项 2.1.安全 2.2.策略 2.3.集成 2.4高级

  3. 1.2 操作系统的第二个功能——并发功能 -《zobolの操作系统学习札记》

    1.2 操作系统的第二个功能--并发功能 目录 1.2 操作系统的第二个功能--并发功能 问1:什么是并发功能?并发功能是必要的吗? 问2:并发功能必须要求拥有多核CPU吗? 问3:多核CPU和单核C ...

  4. 简述电动汽车的发展前景及3D个性化定制需求

    李彦宏前几天又搞事,他宣布百度要开始造电动汽车了!百度市值更是因此一夜暴涨了700亿. 这熟悉的配方,好像在乔布斯.库克那里也见过. 苹果的"iCar"(或者是Apple Car) ...

  5. 如何在vscode 背景配置一个动态小女孩

    D:\Microsoft VS Code\resources\app\out\vs\code\electron-browser\workbench <!-- Copyright (C) Micr ...

  6. SAP -SE30 程序运行时间分析

    运行SE30 选中Program,点击Excute 点击运行 分析结果

  7. leetcode题解#3:无重复字符的最长子串

    leetcode题解:无重复字符的最长子串 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb"输出: 3 解释 ...

  8. windows如何结束某个端口的进程

    netstat -ano | findstr 端口号 (查询端口号被哪个进程占用) tasklist | findstr 进程PID (根据PID找到进程名称) taskkill -PID 进程PID ...

  9. 数学公式 Latex 练习

    \[1+x+x^2+x^3+\cdots=\frac{1}{1-x}\quad x\in(-1, 1) \] 证明:设左边式子项数为 \(n\) 那么可以得到: \[\begin{split} S & ...

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

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