肥宅快乐数

肥宅快乐数

Time limit:1s Memory limit:128M

Description

作为一个肥宅,栗酱每天都从不同的事物上获得快乐。今天他发现每一个形如 (i,j) 的二元组当满足 “i + j == i | j” 时都会给他带来1点快乐。现在问题来了,[1, 2^k] 以内的正整数一共能带给栗酱多少点快乐呢?

答案对1e+7取模

Input

数据的第一行是数据组数T。

在每组数据中:第一行是一个整数k。

T <= 128

k <= 128

Output

每组数据一行,直接输出答案。

Sample Input

2

1

10

Sample Output

2

59048

HINT

(2,1)和(1,2)算不同的二元组

这是我参加的2018年绍兴市市赛的一道题,当时做此题时因组合数过大不会处理而未能做出此题,回来之后参考了一些资料成功解出来了,现补上代码,纪念我的第一道组合数取余。

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int mod=1e9+7;
int c[130][130];
int quick_pow(int n,int m){
    int ans=1;
    while(m){
        if(m&1)
        ans=1ll*ans*n%mod;
        n=1ll*n*n%mod;
        m>>=1;
    }
    return ans;
}
//这个comb用来求组合数取余,借鉴了https://blog.csdn.net/u012860428/article/details/41317231大佬的代码针对这题优化了一下
int comb(int n,int m){
    int ans=1;
    for(int i=1;i<=m;i++){
        int x=n-m+i;
        ans=ans*(1ll*x*quick_pow(i,mod-2)%mod)%mod;
    }
    return ans;
}
int main(){
    for(int i=1;i<=128;i++){
        c[i][0]=1;
        for(int j=1;j<=i;j++){
            if(j>(i>>1))c[i][j]=c[i][i-j];
            else c[i][j]=comb(i,j);
        }
    }
    for(int i=1;i<=100;i++)
    printf("%d ",c[100][i]);
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        //当i等于1<<n时,j只要小于1<<n都满足题目要求,同样当j等于1<<n时,i只要小于1<<n也满足要求,这里一个有(1<<n+1)-2个二元组
        int ans=quick_pow(2,n+1)-2;
        //现在i或j等于1<<n的情况都考虑过了,再来考虑i和j都不等于1<<n的情况
        //也就是在n个2进制位里随意取i个为1,组成的数为题目所说的i,在剩下的n-i个二进制位里随意取j个二进制位为1,组成的数为题目所说的j
        //但是为了满足i和j大于等于1的要求,所以i不能把n个二进制位都取完,所以循环里用i<n
        for(int i=1;i<n;i++)
        ans=(ans+(1ll*quick_pow(2,n-i)-1)*c[n][i])%mod;
        printf("%d\n",ans);
    }
    return 0;
}

大佬的组合数取余代码如下(前提是p为素数)转自:https://blog.csdn.net/u012860428/article/details/41317231

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef long long LL;

LL n,m,p;

LL quick_mod(LL a, LL b)
{
    LL ans = 1;
    a %= p;
    while(b)
    {
        if(b & 1)
        {
            ans = ans * a % p;
            b--;
        }
        b >>= 1;
        a = a * a % p;
    }
    return ans;
}

LL C(LL n, LL m)
{
    if(m > n) return 0;
    LL ans = 1;
    for(int i=1; i<=m; i++)
    {
        LL a = (n + i - m) % p;
        LL b = i % p;
        ans = ans * (a * quick_mod(b, p-2) % p) % p;
    }
    return ans;
}

LL Lucas(LL n, LL m)
{
    if(m == 0) return 1;
    return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%I64d%I64d%I64d", &n, &m, &p);
        printf("%I64d\n", Lucas(n,m));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Angel-Demon/p/10023701.html

时间: 2024-10-11 00:40:36

肥宅快乐数的相关文章

“肥宅快乐数”-python暴力版

编写一个函数来判断一个数是不是"快乐数".一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1.如果可以变为 1,那么这个数就是快乐数 num = input('请输入数字>>>').strip() new_num = num if num.isdigit(): sum1 = 0 check = [] while sum1 !=1: for i in

肥宅快乐树 换根+树形DP/dfs

肥宅快乐树是一棵神秘而巨大的树,它长有许多枝条和节点,每条枝连接树中两个节点,每个节点上都长有一瓶肥宅快乐水. 何老板是肥宅快乐水的资深爱好者.历经艰难,他终于找到了这棵传说中的快乐树.他想要获取树上所有的快乐水,迫不及待地想从树根往树上爬. 每经过一条树枝都会耗费一定体力.而且快乐树自带防御功能,即每条枝上都有一个一次性陷阱,一旦踏上该枝,何老板就会被立即弹射回地面,他得重新从根往上爬. (注1:一次性陷阱是指,陷阱只在第一次经过该枝时有效) (注2:从i号点回到i的父亲节点,不耗费体力) 每

刁肥宅数据结构课设:布隆过滤器的实践与应用(V1.0)

课程编号:                     课程性质:          数据结构课程设计报告         学院:         合肥工业大学            班级:         物联网工程17-2班        姓名:         刁肥宅               学号:         201721800X           教师:         周波                           2018年 8月 10日   至  2018年 8

LeetCode:Happy Number - 快乐数

1.题目名称 Happy Number(快乐数) 2.题目地址 https://leetcode.com/problems/happy-number/ 3.题目内容 英文: Write an algorithm to determine if a number is "happy". A happy number is a number defined by the following process: Starting with any positive integer, repla

A12:快乐数

发现快乐数有如下特征: 1.如果一个数"不快乐",则它计算到后面必然陷入到这个循环里:4, 16, 37, 58, 89, 145, 42, 20, 4, ... 2.对于一个大于243的数字来说,它的下一个数字一定比它小.这是因为一个大于1000的数字,它的下一个数字一定比它小,而对于1000以下最大的数字999,它的下一个数字是243,所以1000以下数字的下一个数字也只可能小于或等于243 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的

LintCode_488 快乐数

题目 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1.如果可以变为1,那么这个数就是快乐数. 样例 19 就是一个快乐数. 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 hash方式实现C++代码 bool isHappy(int n) { // Writ

快乐数问题

问题描述:设计一个算法,判断一个数字是否是“快乐数”.快乐数的定义如下:一个正整数,计算出它各位数字的平方和,得到一个新的数字,再对这个新的数字重复这一过程,直到最后得到数字1或是其他某几个数字的无限循环.在这些数字中,经过上述流程最终能得到数字1的数字,被称为“快乐数”. 分析:整个算法的设计分为两步 第一步:求数下一个平方计算后的数. 第二步:判断数值是否是快乐数. 解法一:分两步进行,第一步计算下一个数,第二步做判断,可以利用一个容器保存计算过的数,只要出现1就直接返回是,如果出现重复的非

lintcode:快乐数

快乐数 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1.如果可以变为1,那么这个数就是快乐数. 样例 19 就是一个快乐数. 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 解题定义最大循环次数方法 public class Solution { /** *

LintCode Python 简单级题目 488.快乐数

题目描述: 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1.如果可以变为1,那么这个数就是快乐数. 您在真实的面试中是否遇到过这个题? Yes 样例 19 就是一个快乐数. 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 标签 数学 哈希表 题目分析: 将数