题意

题解

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. 你要的几个JS实用工具函数(持续更新)

    今天,我们来总结下我们平常使用的工具函数,希望对大家有用.1.封装fetch 源码: /** * 封装fetch函数,用Promise做回调 * @type {{get: (function(*=)) ...

  2. SAP 下拉框(选择屏幕)

    一.选择屏幕下拉框. DATA: g_vrmid TYPE vrm_id, "id of value set gt_vlist TYPE vrm_values, "internal ...

  3. 开通博客-学习java之路

    已被西南交通大学录取,毕设也已经进入末期.开始狂神说的Java学习之路,纪念一下!!!

  4. 通过input的name属性取值

    HTML中 Script中 根据选中的值,res也就拿到相应的值.

  5. 基于Vue3SSR渲染作品H5页

    回顾 多项目之间的关系 业务组件sqxy-components为何要单独抽离出来? 整体思路 根据 id uuid来获取思路 判断 status(未发布,强制下线) 作品数据+leogo-cpmpon ...

  6. 挑战30天写操作系统-day2-汇编语言学习与Makefile入门

    1.介绍文本编辑器 这里,我们直接采用自己windows电脑自带的文本编辑器即可以完成制作要求 2.继续开发 下面先是对昨天使用的helloos.nas文件内容进行详细解释 ; hello-os ; ...

  7. Redis系列3:高可用之主从架构

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 1 主从复制介绍 上一篇<Redis系列2:数据持久化提高可用性>中,我们介绍了Redis中的数据 ...

  8. 牛客SQL刷题第一趴——非技术入门基础篇

    user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male   ...

  9. VMware Workstation是可以跟hyper-v 共存的!

    VMware Workstation是可以跟hyper-v 共存的! 神奇的事情 之前一直不知道这个事情,后来发现,原来是可以的,震惊了我的双眼. 我之前一直用的是桌面的Docker Desktop ...

  10. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...