DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)

玄学代码(是洛谷题解里的一位dalao小粉兔写的)
//数位DP(二进制)计算出f[i]为恰好有i个的方案数。
//答案为∏(i^f[i]),快速幂解决。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=;
ll n,ans=;
ll c,f[];
ll qpow(ll b,ll e){
ll a=;
for(;e;b=b*b%mod,e>>=)
e&?a=a*b%mod:;
return a;
} int main(){
scanf("%lld",&n);
for(int j=;~j;--j){
for(int i=;i;--i)
f[i]+=f[i-];
if(n>>j&)++f[c++];
}++f[c];
for(int i=;i<=;++i)
ans=ans*qpow(i,f[i])%mod;
printf("%lld",ans);
return ;
}
下面是另一位dalaoStyx写的简单易懂的题解



代码如下
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10000007
using namespace std; long long ans=,n,k,cnt,dp[][]; long long kasumi(long long a,long long b)
{
long long tmp=;
while(b)
{
if(b&) tmp=(tmp%mod)*a%mod;
a=(a%mod)*a%mod;
b>>=;
}
return tmp%mod;
} int main()
{
scanf("%lld",&n);
for(int i=; i<=; i++)
{
dp[i][]=;
}
for(int i=; i<=; i++)
{
dp[i][i]=;
}
for(int i=; i<=; i++)
{
for(int j=; j<i; j++)
{
dp[i][j]=dp[i-][j-]+dp[i-][j];
}
}
for(k=; k<=n; k<<=)
{
n-=k;
cnt++;
for(int j=; j<=cnt; j++)
{
ans=(ans%mod)*kasumi(j,dp[cnt][j])%mod;
ans%=mod;
}
}
cnt=;
for(int i=;i>=;i--)
{
if((1ll<<i)<=n)
{
for(int j=;j<=i+;j++)
{
ans=(ans%mod)*kasumi(j+cnt,dp[i+][j]);
ans%=mod;
}
cnt++;
n-=(1ll<<i);
}
}
printf("%lld\n",ans);
}
至于为什么不用扩展欧拉定理降幂,那是因为杨辉三角在总和等于1e15的时候 ,每一个数肯定不会爆longlong
DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)的更多相关文章
- 洛谷P4317 花神的数论题
洛谷题目链接 数位$dp$ 我们对$n$进行二进制拆分,于是就阔以像十进制一样数位$dp$了,基本就是套模板.. 接下来是美滋滋的代码时间~~~ #include<iostream> #i ...
- 洛谷 P4317 花神的数论题 || bzoj3209
https://www.lydsy.com/JudgeOnline/problem.php?id=3209 https://www.luogu.org/problemnew/show/P4317 设c ...
- 洛谷 P4317 花神的数论题(组合数)
题面 luogu 题解 组合数 枚举有多少个\(1\),求出有多少种数 扫描\(n\)的每一位\(1\), 强制选\(0\)然后组合数算一下有多少种方案 Code #include<bits/s ...
- P4317 花神的数论题
题目 洛谷 数学方法学不会%>_<% 做法 爆搜二进制下存在\(i\)位\(1\)的情况,然后快速幂乘起来 My complete code #include<bits/stdc++ ...
- P4317 花神的数论题 dp
这题我一开始就想到数位dp了,其实好像也不是很难,但是自己写不出来...常规套路,f[i][j][k][t],从后往前填数,i位,j代表是否卡着上沿,k是现在有几个1,t是想要有几个.记忆化搜索就ok ...
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- P4317 花神的数论题 动态规划?数位DP
思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...
- Luogu P4317 花神的数论题
也是一道不错的数位DP,考虑先转成二进制后再做 转化一下问题,考虑统计出\([1,n]\)中在二进制下有\(i\)个\(1\)的方案数\(cnt_i\),那么答案显然就是\(\prod i^{cnt_ ...
- P4317 花神的数论题,关于luogu题解粉兔做法的理解
link 题意 设 \(\text{sum}(i)\) 表示 \(i\) 的二进制表示中 \(1\) 的个数.给出一个正整数 \(N\) ,求 \(\prod_{i=1}^{N}\text{sum}( ...
随机推荐
- Java笔记(第五篇)
抛出异常 使用throws声明抛出异常 Throws 通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常进行处理时,就可以在声明方法时使用throws声明抛出的异常,然后再调用该方法的其他方 ...
- Jquery开发&BootStrap 实现“todolist项目”
作业题目:实现“todolist项目” 作业需求: 基础需求:85%参考链接http://www.todolist.cn/1. 将用户输入添加至待办项2. 可以对todolist进行分类(待办项和已完 ...
- 【Android-代码破解】代码破解步骤
一.准备工具 准备要破解的apk 下载dex2jar 下载jd-gui 下载apk-tool 二.反编译apk得到Java源代码 (dex2jar是将apk中的classes.dex转化成Jar文件, ...
- luogu 3047 [USACO12FEB]附近的牛Nearby Cows 树形dp
$k$ 十分小,直接暴力维护 $1$~$k$ 的答案即可. 然后需要用父亲转移到儿子的方式转移一下. Code: #include <bits/stdc++.h> #define M 23 ...
- python并发——信号量
信号量通常用于保护数量有限的资源,例如数据库服务器.在资源数量固定的任何情况下,都应该使用有界信号量.在生成任何工作线程前,应该在主线程中初始化信号量. 工作线程生成后,当需要连接服务器时,这些线程将 ...
- Leetcode题目70.爬楼梯(动态规划+递归-简单)
题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 ...
- skbuff
在2.6.24之后这个结构体有了较大的变化,此处先说一说2.6.16版本的sk_buff,以及解释一些问题. 一. 先直观的看一下这个结构体~~~~~~~~~~~~~~~~~~~~~~在下面解释每个字 ...
- 单调队列优化dp,k次移动求最长路
洛谷2254 给你k次移动 每次移动给你一个时间段 a,b和方向dir 地图上有障碍物 为了不撞上障碍物你可以施法让箱子停下来 问箱子可以走的最长路 ((以下是洛谷的题解)) /*首先考虑对于时间t来 ...
- laravel 链式组合查询数据
laravel 链式组合查询数据 一.总结 一句话总结: - 就是链式操作的基本操作,因为返回的都是一直可以进行链式操作的对象,所以我们接收返回的对象即可 - $result = DB::table( ...
- maven plugin
assembly plugin [Maven学习]maven-assembly-plugin的使用 https://www.cnblogs.com/f-zhao/p/6929814.html使用Mav ...