bzoj3209 花神的数学题

3209: 花神的数论题

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 1612  Solved: 746

[Submit][Status][Discuss]

Description

背景

众所周知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。

描述

话说花神这天又来讲课了。课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了。

花神的题目是这样的

设 sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,花神要问你

派(Sum(i)),也就是 sum(1)—sum(N) 的乘积。

Input

一个正整数 N。

Output

一个数,答案模 10000007 的值。

Sample Input

样例输入一

3

Sample Output

样例输出一

2

HINT

对于样例一,1*1*2=2;

数据范围与约定

对于 100% 的数据,N≤10^15

Source

原创 Memphis

数位DP+数论

令f[x]表示sum[i]=x的i的个数,则最终答案等于(1^f[1])*(2^f[2])*(3^f[3])*……

因为底数的范围很小,而10000007=941*10627,所以底数和10000007一定互质,根据欧拉定理,只要将指数对phi(10000007)=9988440取模就可以了。

那现在问题就是如何求f[x]。

从高位向低位进行数位DP,具体方法见程序。

为什么各种各样的DP自己都想不出来...(╯‵□′)╯︵┻━┻

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define mod 10000007
#define phi 9988440
using namespace std;
ll n,ans=1,c[60][60],f[60];
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch>='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void dp(ll x)
{
	int tmp=0,cnt=0;ll now=0;
	while ((1ll<<tmp)<x) tmp++;
	D(i,tmp,0) if (now+(1ll<<i)<=x)
	{
		F(j,0,i) (f[j+cnt]+=c[i][j])%=phi;
		cnt++;now+=(1ll<<i);
	}
}
inline ll getpow(ll x,ll y)
{
	ll ret=1;
	for(;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;
	return ret;
}
int main()
{
	scanf("%lld",&n);
	F(i,0,50)
	{
		c[i][0]=1;
		F(j,1,i) c[i][j]=(c[i-1][j-1]+c[i-1][j])%phi;
	}
	dp(n+1);
	F(i,1,50) ans=ans*getpow(i,f[i])%mod;
	printf("%lld\n",ans);
}
时间: 2024-10-13 21:52:26

bzoj3209 花神的数学题的相关文章

BZOJ3209: 花神的数论题

3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 689  Solved: 334[Submit][Status] Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了.花神的题目是这样的设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你派(S

【BZOJ3209】花神的数论题 数位DP

[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了.花神的题目是这样的设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. Input 一个正整数 N. Output 一个数,答案模 10000007 的值. Samp

bzoj3209:3209: 花神的数论题

觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[i-1][j]; 然后我就开始gang.然后先是for for j没有从0开始.然后是cnt增加的时候忘了*,接着是1<<tmp没有用ll,还有是读入优化没有用longlong,最后成功的过了若干较小的数据.WAWAWAWAWA5发.最后发现指数不能直接取模!.终于AC了喜极而泣TAT =>

【bzoj3209】 花神的数论题

http://www.lydsy.com/JudgeOnline/problem.php?id=3209 (题目链接) 题意 ${sum(i)}$表示${i}$的二进制表示中${1}$的个数.求${\prod^n sum(i)}$ Solution ${f_{i,s}}$表示dp到第${i}$位,已经有${s}$个${1}$时的乘积.然后一路dfs就可以了. 细节 LL,返回值要与1取个max 代码 // bzoj3598 #include<algorithm> #include<ios

【BZOJ3209】花神的数论题 数位DP(我姿势不标准,但是可能更好写)

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43370607"); } 题解: 数位DP无疑.注:下面说的位基本都是二进制. f[i][j]表示前i位数中有j个1的数的数量(包括0哦~) 然后一个低位数后面填0/1分别是两种向高位的转移,这样在O(log^2 n)时间内处理出f 主要是我的姿势(嗯

HDU5344——数学题——MZL&#39;s xor

MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to know the xor of all (Ai+Aj)(1≤i,j≤n)The xor of an array B is defined as B1 xor B2...xor Bn Input Multiple test cases, the first line contains an integer T(no more than 20

【算法编程】小学数学题难倒博士

昨天在科学网上得知这样一个新闻<越南小学数学题难倒博士>,据悉题目来自越南保禄小学三年班,不过报道称该题难倒了上至博士下至家长,未免也太言过其实了. 题目描述 学生需要在下图表格中按由上至下.从左到右的顺序,填入1~9的数字,可重复填写,并按先乘除后加减(图中冒号代表除法)的运算法则,完成整条算式. 解题方法 显然,这题对于我们这种程序员来说完全不是问题,只要在大一上过C语言的学生(我们学校全校都学过C,即使是文科专业)基本上都可以用九重for循环来穷举解出此题,下面我分别用C和Matlab实

hdu 4974 A simple water problem(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4974 Problem Description Dragon is watching competitions on TV. Every competition is held between two competitors, and surely Dragon's favorite. After each competition he will give a score of either 0 or

bzoj 3207: 花神的嘲讽计划Ⅰ

Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: "哎你傻不傻的![hqz:大笨J]" "这道题又被J屎过了!!" "J这程序怎么跑这么快!J要逆袭了!" -- 描述 这一天DJ在给吾等众蒟蒻讲题,花神在一边做题无聊,就跑到了一边跟吾等众蒟蒻一起听.以下是部分摘录: 1. "J你在讲什么!" "我在讲XXX!" "哎你傻不傻的!这么麻烦,直接XXX再XXX就好了!"