题目描述
华华刚刚帮月月完成了作业。为了展示自己的学习水平之高超,华华还给月月出了一道类似的题:

⊕符号表示异或和,详见样例解释。
虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希望你写个程序帮她验证一下。
输入描述:
输入一个正整数N。
输出描述:
输出答案Ans。
输入
3

输出
18

说明

示例2
输入
2005117
输出
复制
863466972
备注:

PS:第一次遇见这种题目直接傻眼了,不知道这是一个积性函数,这个概念也没听说过,然后取学习了相关知识,不仅被这个题目所折服,这个题目实在太巧妙了。

推荐罗永军老师的博客积性函数的前世今生

1.首先做这个题目肯定需要快速幂,下面给出模板

ll fastpow(ll a, ll b)
{ll ans = 1;while (b){if (b & 1)ans = (ans * a) % mod;a = (a * a) % mod;b >>= 1;}return ans;
}

2.其次,我们需要了解欧拉筛与积性函数之间的关系,这个题目需要求前n项的异或和就需要用到积性函数的性质,加上欧拉筛就能很好的解决这个问题,并且时间复杂度很低,下面给出欧拉筛的代码
欧拉筛

int prime[MAXN];              //保存质数
int vis[MAXN];                //记录是否被筛
int euler_sieve(int n){       //欧拉筛。返回质数的个数。int cnt = 0;              //记录质数个数memset(vis,0,sizeof(vis));memset(prime,0,sizeof(prime));for(int i=2;i<=n;i++){             //检查每个数,筛去其中的合数if(!vis[i]) prime[cnt++]=i;    //如果没有筛过,是质数,记录。第一个质数是2for(int j=0; j<cnt; j++){      //用已经得到的质数去筛后面的数if(i*prime[j] >n)  break;  //只筛小于等于n的数vis[i*prime[j]]=1;         //关键1。用x的最小质因数筛去xif(i%prime[j]==0)  break;  //关键2。如果不是这个数的最小质因子,结束}}return cnt;                        //返回小于等于n的素数的个数
}

欧拉筛求质数+最小质因子

int prime[MAXN];      //记录质数
int vis[MAXN];      //记录最小质因子
int euler_sieve(int n){     int cnt=0;memset(vis,0,sizeof(vis));memset(prime,0,sizeof(prime));for(int i=2;i<=n;i++){               if(!vis[i]){ vis[i]=i; prime[cnt++]=i;}    //vis[]记录x的最小质因子for(int j=0; j<cnt; j++){       if(i*prime[j] >n)  break;       vis[i*prime[j]]=prime[j];              //vis[]记录x的最小质因子if(i%prime[j]==0)break;                  }}return cnt;
}

以上代码都是在罗永军老师博客里参考的,老师讲的十分详细并且通俗易懂,十分感谢老师,也很幸运偶然之间得到了老师博客的地址,必回常常拜读老师的大作

罗永军老师的博客地址

有了以上的基础,那么就能很好的解决这个题目,做完这个题目之后,不禁感叹,实在太巧妙了!!!

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 13e6 + 10;
const int mod = 1e9 + 7;ll fastpow(ll a, ll b) //快速幂
{ll ans = 1;while (b){if (b & 1)ans = (ans * a) % mod;a = (a * a) % mod;b >>= 1;}return ans;
}
ll prime[maxn], fac[maxn], cnt;
bool vis[maxn];void solve(ll n)
{fac[1] = 1; //初始化for (int i = 2; i <= n; ++i){if (!vis[i]) //如果这个数没有被访问{prime[++cnt] = i;       //记录最小质数,用来筛去后面的数fac[i] = fastpow(i, n); //求解当前的函数值}for (int j = 1; j <= cnt && i * prime[j] <= n; ++j){vis[i * prime[j]] = 1;fac[i * prime[j]] = fac[i] * fac[prime[j]] % mod; //公式if (i % prime[j] == 0)                            //如果它不是这个数的最小质因子就跳过break;}}
}
int main()
{ll n, ans = 0;scanf("%lld", &n);solve(n);for (int i = 1; i <= n; ++i)ans ^= fac[i];printf("%lld\n", ans);
}
人生总是充满了惊喜和失落 ,有恰到好处的遇见,也有撕心裂肺的怀念,但时间总是向前,没有一丝可怜,不论剧终还是待续,愿都能以梦为马,不负此生~

牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)相关推荐

  1. 积性函数欧拉函数莫比乌斯函数

    积性函数 (积性函数). 如果算术函数fff对任意两个互素的正整数a和b,f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b),则fff被称为积性函数(或乘性函数):如 ...

  2. 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)

    链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...

  3. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  4. 牛客训练四:Applese 涂颜色(费马小定理+快速幂)

    题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了. 所以总共有2^n中结果. 由于n太大,所以要用到费马小定理a^n%mod= ...

  5. 积性函数与线性筛(还不会)

    blogs 约数线筛 约数埃筛: vector<int> ys[500010]; void shaiys() {for(int i=1;i<=maxx;i++)for(int j=1 ...

  6. 《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  7. 线性筛及其扩展-积性函数

    线性筛 埃氏筛 对于每个数\(x\),枚举其倍数,将\(kx\)筛去. 在埃氏筛过程中,每个数都会被筛掉多次,且对于每个数x,枚举其倍数的次数为\(\frac{n}{x}\) 故埃氏筛的时间复杂度为\ ...

  8. 积性函数的性质及证明 + 线性筛

    引言 在数论问题中,积性函数有着广泛的应用. 如在莫比乌斯反演问题中,函数变换之后如何快速维护前缀和往往是最重要也是最难的一步.如果维护的函数具有积性,那就可以尝试利用线性筛在O(n)O(n)O(n) ...

  9. 牛客23054 华华开始学信息学 树状数组分块

    题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...

最新文章

  1. 数学公式识别神器—Mathpix Snip
  2. 紧急通知,读者服务群大调整
  3. 实时获取vuex更新的新数据_京东手机销量实时数据更新 荣耀Play4T Pro位列第一
  4. python一对一_Python:在数据存储区中建立一对一的关系
  5. SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
  6. python学什么东西_什么是Python?你应该学习和使用它的13个理由
  7. linux搭建vsftp服务器_Linux(CentOS 7)搭建VSFTP服务器
  8. CSRF与XSS攻击的原理与防范
  9. 使用python实现一个(文件版)简单的课程管理系统
  10. jackson dataformat yaml简介及使用
  11. windows的那些好软件
  12. 找工作笔试面试那些事儿(14)---轻松一下,谈谈面试注意的点
  13. 合天网安实验室CTF-解密200-找茬游戏
  14. 移动端手指事件和手机事件:
  15. Excel2007将汉字转换为拼音首字母
  16. 【知识图谱】知识图谱的本质是什么?
  17. Symantec Backup Exec 2010 安装报 bad ELF interpreter: No such file or directory
  18. 何恺明霸榜!近10年里的具有影响力的一作(年轻)AI学者大盘点!谷歌机构排名第一!...
  19. sql2008 1814错误
  20. 做接口测试前必备的网络基础知识,你get了吗?

热门文章

  1. 五分钟读懂:大数据和传统数据的区别
  2. No suitable driver found for jdbc:mysql://localhost:3306/shumei?serverTimezone=UTCuseSSL=NO
  3. LabVIEW的控件表示法(GxxBxxxYxxSx)
  4. 数字图像处理--基本图像操作
  5. DW设计的服装展示网站
  6. mysql五日均线_一位短线天才领悟5日均线买卖铁律,看懂不再被套,简单易学
  7. 1.让博客被搜索引擎检索到
  8. WPF 修改屏幕亮度
  9. VCL界面组件DevExpress VCL v22.2 - 拥有全新的矢量图形
  10. 这么强大背景的TD一夜之间轰然倒塌!