当前位置: 首页 > news >正文

Educational Codeforces Round 33 (Rated for Div. 2) E. Counting Arrays [数论II][组合数学]

题目:http://codeforces.com/contest/893/problem/E

 

题意:给出1e5组询问,每组要求y个整数乘积为x,输出组合种类数。(x,y<=1e6)

题解:把x分解成它的所有质因子乘积的形式,例如18=2*3*3 则可以把每个质因子分解为可空的y份,可利用组合数计算。假设有1个数字要分解为3份,可假设为1+3个数字分解为不可空的3份,转化为高中数学的隔板问题,cnt个数字分解为y份答案为$C^{y-1}_{cnt+y-1}$,分解的所有情况的乘积则为答案。先初始化1e6的素数表,分解每个数字,利用快速幂log计算组合数。

但是不能暴力对每一个数字寻找质因数,1e6*1e5肯定会T。需要做一些优化,先初始化出每个数字最小的质因子,然后从x开始向下转移,1e6的数字质因子数不超过20种,复杂度为O(q*20*logx)。

#include<bits/stdc++.h>
#define pii pair<int, int>
#define mod 1000000007
#define mp make_pair
#define pi acos(-1)
#define eps 0.00000001
#define mst(a,i) memset(a,i,sizeof(a))
#define all(n) n.begin(),n.end()
#define lson(x) ((x<<1))
#define rson(x) ((x<<1)|1)
#define inf 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 1.5e6 + 500;
vector<int>prime;
int isprime[maxn];
void getprimelist(int t)
{
    mst(isprime, 1);
    isprime[1] = 0;
    for (int i = 2; i <= t; ++i)
    {
        if (isprime[i])prime.push_back(i);
        for (int j = 0; j < prime.size() && prime[j] * i <= t; ++j)
        {
            isprime[prime[j] * i] = 0;
            if (i%prime[j] == 0)break;
        }
    }
}
ll quickmod(ll a, ll b)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans*a%mod;
        b >>= 1;
        a = (a%mod)*(a%mod) % mod;
    }
    return ans;
}
ll c[maxn];
ll C(ll n, ll m)
{
    return c[n] * quickmod(c[m] * c[n - m] % mod, mod - 2) % mod;
}
int init[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int i, j, k, m, n;
    getprimelist(1005000);
    c[0] = 1;
    c[1] = 1;
    for(int i=  2;i<=1005555;++i)
        c[i] = c[i - 1] * i%mod;
    int T;
    for(int i = 2;i<=1000000;++i)
    {
        if(isprime[i])
        {
            init[i]=i;
            continue;
        }
        for(auto it :prime)
        {
            if(i%it==0)
            {
                init[i]=it;
                break;
            }
        }
    }
    cin >> T;
    while (T--)
    {
        cin >> n >> m;
        ll ans = 1;
        while(n>=2)
        {
            int cnt = 0;
            int now = init[n];
            while (init[n]==now)
            {
                n /= now; cnt++;
            }
            ll tt = C(cnt + m - 1, m - 1);
            ans = ans*tt%mod;
        }
        ll tt = quickmod(2, m - 1);
        ans = tt*ans%mod;
        cout << ans << endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Meternal/p/7910564.html

相关文章:

  • [学习笔记]拉格朗日插值
  • 网络的分类
  • IIS 6.0/7.0/7.5、Nginx、Apache 等Web Service解析漏洞总结
  • Python3 标准库概览
  • C#进阶系列——AOP?AOP!
  • QT5 进度条传文件
  • 网上炒股2
  • 大快搜索城市运河大数据政务管理平台案例解读
  • Axure RP初学2
  • AES加解密 集成 spring MVC
  • 硬科技产业的创新与难点,核心都在“技术落地”
  • 媒体转码HLS标准加密详解
  • 微信小程序视图层WXSS
  • Tomcat下wtpwebapps文件夹 和 webapps文件夹区别
  • 挂载本机的镜像文件到本机的某个目录
  • docker-consul
  • hadoop集群管理系统搭建规划说明
  • linux安装openssl、swoole等扩展的具体步骤
  • vue-router的history模式发布配置
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 三分钟教你同步 Visual Studio Code 设置
  • 详解NodeJs流之一
  • kubernetes资源对象--ingress
  • #1015 : KMP算法
  • (20050108)又读《平凡的世界》
  • (4)logging(日志模块)
  • (LeetCode) T14. Longest Common Prefix
  • (zt)最盛行的警世狂言(爆笑)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)鸿鹄云架构一服务注册中心
  • (未解决)macOS matplotlib 中文是方框
  • (一)Linux+Windows下安装ffmpeg
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net 路由处理厉害了
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET下ASPX编程的几个小问题
  • @Autowired和@Resource的区别
  • @ConfigurationProperties注解对数据的自动封装
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [16/N]论得趣
  • [BT]BUUCTF刷题第4天(3.22)
  • [BT]BUUCTF刷题第8天(3.26)
  • [C++]模板与STL简介
  • [dart学习]第四篇:函数
  • [IE编程] 如何获得IE版本号
  • [JavaWeb]—Spring入门
  • [Linux]进程间通信(system V共享内存 | system V信号量)