P1424 幂积序列

题目描述:

设 x,y 为非负整数,试计算集合 M={(2^x)*(3^y),x>=0,y>=0} 的元素不大于指定整数 n 的个数,并求这些元素从小到大排序的第 m 项。

输入描述

多组输入,每组一行,输入 n 和 m,n 和 m 之间用一个空格分开

输出描述

对于每组输入,输出数列中不大于 n 的项数以及第 m 项的值,这两个数占两行。

样例输入:

10000000 100

样例输出:

190

93312

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        int a[100001];
        int k=0;
        for(int i=1;i<=n;i++)
        {
            int temp=i;
            while(temp%2==0)
                temp/=2;
            while(temp%3==0)
                temp/=3;
            if(temp==1)
                a[++k]=i;
        }
        cout<<k<<endl<<a[m]<<endl;
    }
}

 

### 关于 AcWing 平台上快速逆元算法实现 #### 快速逆元简介 在模意义下计算乘法逆元是一个常见的需,在许多竞赛编程题目中都会遇到。对于给定的整数 \( a \),如果存在一个整数 \( b \) 使得 \( ab ≡ 1 (\mod p)\),那么 \( b \) 就被称为 \( a \) 的模 \( p \) 下的乘法逆元。 利用费马小定理可以简化这一过程,即当 \( p \) 是质数时,\( a^{p−1}≡1(\mod p) \)[^1]。因此可以通过快速来高效地找到这个逆元,时间复杂度为 O(log n)[^3]。 #### Python 实现代码示例 下面展示如何通过Python编写函数`quick_pow_mod(a, k, m)`来进行快速运算,基于此构建解逆元的功能: ```python def quick_pow_mod(a, k, mod): res = 1 % mod while k: if k & 1 == 1: res = res * a % mod k >>= 1 a = a * a % mod return res def inv_mod(num, prime): """返回num关于prime取模下的逆元""" return quick_pow_mod(num, prime - 2, prime) if __name__ == "__main__": num = int(input()) prime = int(input()) print(inv_mod(num, prime)) ``` 这段代码首先定义了一个用于执行快速操作的方法 `quick_pow_mod()` ,接着创建了另一个方法 `inv_mod()` 来调用前者传入参数 `(num, prime-2, prime)` 计算所需的逆元[^2]。 #### 应用场景举例 考虑这样一个具体的应用案例:假有一个长度为 N 的数组 A[] 和一个正整数 P(P>1),现在要找出有多少种不同的子序列满足其所有元素对P取余的结果等于X(X<P) 。这个问题涉及到组合数学中的排列计数技巧以及使用快速逆元优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值