首页 > 其他分享 >约数个数

约数个数

时间:2022-12-02 21:22:20浏览次数:35  
标签:约数 10000010 ci 询问 个数 因子

sloj #P4001. 约数个数

题目描述

给出整数x,求它的约数个数

为了加大难度,有m次询问,将每次询问的答案求和然后mod109+7

输入格式

第一行是一个整数m

第二行是整数q1,a,b,c

q1表示第一次询问的数字

第i次询问qi​=(qi1​∗a+b)%c

输出格式

所有询问的答案之和mod109+7

样例

输入数据 1

2 
2 2 1 9

输出数据 1

4

数据规模与约定

100%的数据保证 A,B,C<=107,1<=Q1<=C。

 要做这道题,首先你得知道:n = p1c1*p2c2*p3c3*……*pici这些应该都知道吧,就是质(只)因式分解我是小黑子,不知道的可以出门左转了

还要知道:d(因数个数) = (c1+1)*(c2+1)*(c3+1)*……*(ci+1)

上面那俩都是小学奥数吧,不会的可以让你妈再生一个了,这号基本练废了

证明我就不在这里放出了,这很显然嘛

设e[i]表示最小质(只)因子出现次数,g[i]为约数个数,因为线性筛只用得到最小质(只)因子,对于素数,明显有g[i] = 2,e[i] = 1

如果是合数,那么就有e[k] = e[i]+1; g[k] = (g[i]/(e[i]+1)*(e[k]+1));

e[k]为当前最小质因子出现次数

g[i]需要先除一个e[i]+1则是因为变更这个最小质因子时要把原来算的先给除去才能得到正确答案

不然就是会变为个d = (c1+1)*(c2+1)*(c3+1)*……(ci+1)*((ci+1)+1)

如果还没看懂那就直接抄代码去吧,绝对不是我讲不清楚了

注意:如果这个质因子第一次出现则是个g[k] = g[i]*2

分析完毕,上代码

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
int q,a,b,c,m,g[10000010],e[10000010],vis[10000010],prime[10000010],cnt;
ll ans = 0;
void pre(){
    g[1] = 1;
    for(int i = 2;i<=c;i++){
        if(!vis[i]){
            prime[++cnt] = i;
            e[i] = 1;
            g[i] = 2;
        }
        for(int j = 1;j<=cnt&&i*prime[j]<=c;j++){
            int k = i*prime[j];
            vis[k] = 1;
            if(i%prime[j]==0){
                e[k] = e[i]+1;
                g[k] = (g[i]/(e[i]+1)*(e[k]+1));
                break;
            }
            e[k] = 1;
            g[k] = g[i]*2;
        }
    }
}
int main(){
    scanf("%d%d%d%d%d",&m,&q,&a,&b,&c);
    pre();
    ans = g[q]%mod;
    for(int i = 2;i<=m;i++){
        q = ((long long)q*a+b)%c;
        ans+=g[q]%mod;
    }
    printf("%lld",ans);
    return 0;
}

 

标签:约数,10000010,ci,询问,个数,因子
From: https://www.cnblogs.com/cztq/p/16945647.html

相关文章

  • 【算法】用面向对象的方法求出数组中重复 value的个数,按如下个数输出:
    1出现:1次3出现:2次8出现:3次2出现:4次int[]arr={1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5};今天看一个关于基础资料的文档,里面有这么一道算法题。刚开始看了一下,只......
  • 输出10个数中只出现一次的数的个数c++实现
    题目描述针对一个可能含有重复整数出现的一维整数数组【10个元素】,请输出只出现过一次的整数元素的数目。输入31637575894729108931输出4样例输入Copy)3......
  • vs.net 2010两个数据库方面的好工具
    今天发现vs.net2010在处理数据库方面的两个不错的工具,分别是数据异同比较器和数据架构比较器,使用起来都很简单,要学习的话,可以从下面两个连接......
  • mongodb中重命名一个数据库
    MongoDB并没有提供renameDatabase的命令,用户的想法是通过copydb来实现,先将数据库拷贝一份,然后删除老的数据库,但由于DB里数据很多,copydb太耗时,想知道是......
  • 统计字符个数
    凡是统计有限字符类型个数问题,都可以开一个和字符类型个数相同大小的数组,然后每个数组下标表示一个字符类型,遇到该类型字符,对应的数组下标里的数自增就可以。用下标表示字......
  • springboot配置多个数据源
    前言,什么是数据源与数据库连接池:说SpringBoot的多数据源配置之前,我们先了解下DataSource。在java中,操作数据库有很多方式,在众多方式中除了JDBC外还有DataSource对象......
  • js day04 实参与形参个数不一致
    //functionfn(x,y){    //  //x=1    //  //y=undefined    //  //1+undefined = NaN    //  ......
  • 剑指offer:最小的K个数
    题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。方法一O(n)改变输入,适合小数据classSolution{public:vector<i......
  • 汇编程序:输入一个数并显示出现
    codesegment;代码段定义开始assumecs:codestart:movah,1int21hmovdl,al;输入的数在al中,赋值到dlmovah,2;调用2号功能调用输出字符......
  • 约数与同余
    约数与同余质数1.质数分布定理:在\(1\simN\)中大约有\(\frac{x}{\lnx}\)个,N越大越精准2.判断n为质数的方法:试除法:(可以顺带求出约数集合)intt=sqrt(n);if(n<2)retu......