数论整理之算数基本定理de变形

简介: 数论整理之算数基本定理de变形

D - Sigma Function

这道题一看到就和上一道题很像,以为也是算数基本定理的考查,做了一下,发现能过样例……tle……

tle的思路:经过多次验算???就是发现幂的规律吧,只要存在一个pi,ei都为奇数的pi^ei,就能使sum为偶数。(素因子分解后,全为奇 ^ 偶,偶 ^ 偶,偶 ^ 奇,因子和就是奇数。)

tle的代码做个借鉴:


//输出格式没改
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MAX 1000005
#define mod 1000000007
using namespace std;
long long p[MAX],v[MAX],num_prime;
void GetPriem()//获得素数
{
    memset(p,0,sizeof(p));
    memset(v,0,sizeof(v));
    for(int i=2;i<MAX;i++)
    {
        if(!v[i])
        {
            p[++num_prime]=i;
            for(int j=i;j<MAX;j+=i)
                v[j]=1;
        }
    }
}
long long Ans(long long n)
{
    long long cnt,sum=0;
    for(int i=1;i<=num_prime && p[i]<=n;i++)
    {
        if(n%p[i]==0)
        {
            cnt=0;
            while(n%p[i]==0)
            {
                cnt++;
                n/=p[i];
            }
            if(cnt % 2 != 0 && p[i] % 2 != 0)
            {
                sum = 1;
            }
        }
    }
    if(n > 1)
        sum = 1;
    return sum;
}
int main()
{
    GetPriem();
    int T,cnt=1,i,j;
    long long n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld",&n);
        long long m = 0;
        for(int k = 1;k <= n;k++)
        {
            m += Ans(k);
        }
        cout<<m<<endl;
    }
    return 0;
}

题解:

打表找规律。

素因子分解打表计算前n项和判断奇数偶数可以发现如下规律:


只要是2 ^ x,a ^ 2,2 * a ^ 2…只有这种数的因子和是奇数。所以,我们直接去重即可。

但是这些直接去重我们会发现减去的这些值有重复的,所以我们要判断下。


i (代表x||a): 0 1 2 3 4 5 6 7 8 9 …


2^x: 1 2 4 8 16 32 64 128 …


a^2: 0 1 4 9 16 25 36 49 64 …


2*a^2: 0 2 8 18 32 50 72 …


我们可以发现2x里面有的数,a2和2*a^2里面都有。


加下划线的字一一对应,加粗的字一一对应。


①2 ^ x和a ^ 2, 当x为偶数时二者出现重复。

②2 ^ x和2*a ^ 2,当x为奇数时,二者出现重复。


所以不需要考虑2 ^ x的个数,直接用n减去a ^ 2和2*a^2的个数就是我们要的结果。


易知:a ^ 2的个数=sqrt(n),2*a^2的个数=sqrt(n/2)。


那么为什么会是这样呢?给出推导过程:


n=p1 ^ e1p2 ^ e2…,则f(n)=(p1 ^ (e1+1)-1)/(p1-1))(p2^(e2+1)-1)/(p2-1))…

且(p1 ^ (e1+1)-1)/(p1-1))=p1 ^ 0+p1 ^ 1…+p1 ^ e1;

要使得f(n)为奇数,则(p1 ^ (e1+1)-1)/(p1-1)到(pn^(en+1)-1)/(pn-1)都要为奇数;


因为奇数 * 奇数=奇数,奇数 * 偶数=偶数;


1)当p=2时,2^(e+1)-1,一定为奇数;

2)当p!=2时,则p为奇数(因为p是素因子),则当e为偶数时(p^(e+1)-1)/(p-1)为奇数。


经转化我们可以发现,26=82,211=2*322。也就是平方数和2倍的平方数。

则需要统计1到n中的平方数个数和2倍的平方数的个数,得到的为1到n中f(n)为奇数的个数。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
    int t;
    scanf("%d",&t);
    for(int kase=1;kase<=t;kase++)
    {
        LL n;
        scanf("%lld",&n);
        LL num1=(LL)sqrt((double)n);
        LL num2=(LL)sqrt((double)n/2.0);
        printf("Case %d: %lld\n",kase,n-num1-num2);
    }
    return 0;
}


相关文章
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第23天】在数字化时代,网络安全与信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者更好地了解网络安全的重要性,并提供一些实用的建议来保护自己的信息安全。
|
开发者
面向对象的VB编程:类与对象的深入理解
【4月更文挑战第27天】本文探讨了VB中的面向对象编程,包括类与对象的概念、定义、声明和使用。通过封装、继承和多态三大特性,阐述了如何在VB中实现代码的易理解和扩展。示例展示了如何定义类、创建对象以及如何利用继承和多态性来设计灵活的代码结构。理解并掌握这些核心概念对于提升VB.NET开发效率至关重要。
244 0
|
安全 Java API
java8常用新特性(超详细)
java8常用新特性(超详细)
129 0
|
机器学习/深度学习 数据可视化 数据挖掘
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
472 0
|
JavaScript 前端开发 索引
Vue2和Vue3的区别:从响应式开始
如果在项目中使用过Vue,那么一定会享受到其响应式带来的好处。作为前端三大框架之一的Vue,已经迭代出Vue2和Vue3两个大版本,Vue3是兼容Vue2的,但是为了区分,我们暂且将其看作是两个独立的框架。Vue3对响应式做了比较大的调整,工作原理上与Vue2并不相同,但是效率上来说Vue3是更好的选择。
1519 0
Vue2和Vue3的区别:从响应式开始
|
Java
第一季:3类和实例初始化【Java面试题】
第一季:3类和实例初始化【Java面试题】
121 0
|
Python
【Python入门篇】——Python函数(函数介绍,函数的定义,函数的参数和函数的返回值)
【Python入门篇】——Python函数(函数介绍,函数的定义,函数的参数和函数的返回值)
353 0
|
弹性计算 NoSQL 关系型数据库
《云上大型赛事保障白皮书》——第三章 压测调优与技术演练——3.1 云上大型赛事压测调优——3.1.4 北京冬奥压测调优总结(3)
《云上大型赛事保障白皮书》——第三章 压测调优与技术演练——3.1 云上大型赛事压测调优——3.1.4 北京冬奥压测调优总结(3)
180 0
|
Windows
Windows下,BAT文件中使用XCopy复制整个目录
Windows下,BAT文件中使用XCopy复制整个目录
312 0
|
机器学习/深度学习 Python
数据标准预处理合集_python机器学习sklearn库
数据标准预处理合集_python机器学习sklearn库
239 0
数据标准预处理合集_python机器学习sklearn库