• P4317 花神的数论题


    题目

    洛谷
    数学方法学不会%>_<%

    做法

    爆搜二进制下存在(i)(1)的情况,然后快速幂乘起来

    My complete code

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL p=10000007;
    LL n;
    LL f[51][51][2][51],a[51],ans[51];
    LL Dfs(LL now,LL num,LL top,LL need){
    	if(!now) return need==num;
    	if(~f[now][num][top][need]) return f[now][num][top][need];
    	LL Up=top?a[now]:1;
    	LL ret(0);
    	for(LL i=0;i<=Up;++i)
    	    ret+=Dfs(now-1,num+(i==1),top&&(i==Up),need);
    	return f[now][num][top][need]=ret;
    }
    inline LL Pow(LL base,LL b){
    	LL ret(1);
    	while(b){
    		if(b&1) ret=(ret*base)%p;
    		base=(base*base)%p, b>>=1;
    	}return ret;
    }
    inline LL Solve(LL n){
    	LL tot(0);
    	while(n) a[++tot]=n&1,n>>=1;memset(f,-1,sizeof(f));
    	for(LL i=1;i<=50;++i) ans[i]=Dfs(tot,0,1,i);
    	LL ret(1);
    	for(LL i=1;i<=50;++i) ret=(ret*Pow(i,ans[i]))%p;
    	return ret;
    }
    int main(){
    	cin>>n;
    	cout<<Solve(n);
    	return 0;
    }
    
  • 相关阅读:
    linux date使用
    SHELL输出带颜色字体
    vimrc配置
    你所不知道的C++
    temp
    说什么好呢3
    Extjs3 Combo实现百度搜索查询
    Extjs3笔记 fbar
    Extjs combo赋值与刷新的先后顺序
    sql中nvarchar(max)长度测试
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10444508.html
Copyright © 2020-2023  润新知