牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)
题目描述
华华刚刚帮月月完成了作业。为了展示自己的学习水平之高超,华华还给月月出了一道类似的题:
⊕符号表示异或和,详见样例解释。
虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希望你写个程序帮她验证一下。
输入描述:
输入一个正整数N。
输出描述:
输出答案Ans。
输入
3
输出
18
说明
示例2
输入
2005117
输出
复制
863466972
备注:
PS:第一次遇见这种题目直接傻眼了,不知道这是一个积性函数,这个概念也没听说过,然后取学习了相关知识,不仅被这个题目所折服,这个题目实在太巧妙了。
推荐罗永军老师的博客积性函数的前世今生
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;
}
以上代码都是在罗永军老师博客里参考的,老师讲的十分详细并且通俗易懂,十分感谢老师,也很幸运偶然之间得到了老师博客的地址,必回常常拜读老师的大作
罗永军老师的博客地址
有了以上的基础,那么就能很好的解决这个题目,做完这个题目之后,不禁感叹,实在太巧妙了!!!
#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);
}
人生总是充满了惊喜和失落 ,有恰到好处的遇见,也有撕心裂肺的怀念,但时间总是向前,没有一丝可怜,不论剧终还是待续,愿都能以梦为马,不负此生~ |
---|
牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)相关推荐
- 积性函数欧拉函数莫比乌斯函数
积性函数 (积性函数). 如果算术函数fff对任意两个互素的正整数a和b,f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b),则fff被称为积性函数(或乘性函数):如 ...
- 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)
链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )
[每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...
- 牛客训练四:Applese 涂颜色(费马小定理+快速幂)
题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了. 所以总共有2^n中结果. 由于n太大,所以要用到费马小定理a^n%mod= ...
- 积性函数与线性筛(还不会)
blogs 约数线筛 约数埃筛: vector<int> ys[500010]; void shaiys() {for(int i=1;i<=maxx;i++)for(int j=1 ...
- 《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 线性筛及其扩展-积性函数
线性筛 埃氏筛 对于每个数\(x\),枚举其倍数,将\(kx\)筛去. 在埃氏筛过程中,每个数都会被筛掉多次,且对于每个数x,枚举其倍数的次数为\(\frac{n}{x}\) 故埃氏筛的时间复杂度为\ ...
- 积性函数的性质及证明 + 线性筛
引言 在数论问题中,积性函数有着广泛的应用. 如在莫比乌斯反演问题中,函数变换之后如何快速维护前缀和往往是最重要也是最难的一步.如果维护的函数具有积性,那就可以尝试利用线性筛在O(n)O(n)O(n) ...
- 牛客23054 华华开始学信息学 树状数组分块
题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...
最新文章
- 数学公式识别神器—Mathpix Snip
- 紧急通知,读者服务群大调整
- 实时获取vuex更新的新数据_京东手机销量实时数据更新 荣耀Play4T Pro位列第一
- python一对一_Python:在数据存储区中建立一对一的关系
- SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
- python学什么东西_什么是Python?你应该学习和使用它的13个理由
- linux搭建vsftp服务器_Linux(CentOS 7)搭建VSFTP服务器
- CSRF与XSS攻击的原理与防范
- 使用python实现一个(文件版)简单的课程管理系统
- jackson dataformat yaml简介及使用
- windows的那些好软件
- 找工作笔试面试那些事儿(14)---轻松一下,谈谈面试注意的点
- 合天网安实验室CTF-解密200-找茬游戏
- 移动端手指事件和手机事件:
- Excel2007将汉字转换为拼音首字母
- 【知识图谱】知识图谱的本质是什么?
- Symantec Backup Exec 2010 安装报 bad ELF interpreter: No such file or directory
- 何恺明霸榜!近10年里的具有影响力的一作(年轻)AI学者大盘点!谷歌机构排名第一!...
- sql2008 1814错误
- 做接口测试前必备的网络基础知识,你get了吗?
热门文章
- 五分钟读懂:大数据和传统数据的区别
- No suitable driver found for jdbc:mysql://localhost:3306/shumei?serverTimezone=UTCuseSSL=NO
- LabVIEW的控件表示法(GxxBxxxYxxSx)
- 数字图像处理--基本图像操作
- DW设计的服装展示网站
- mysql五日均线_一位短线天才领悟5日均线买卖铁律,看懂不再被套,简单易学
- 1.让博客被搜索引擎检索到
- WPF 修改屏幕亮度
- VCL界面组件DevExpress VCL v22.2 - 拥有全新的矢量图形
- 这么强大背景的TD一夜之间轰然倒塌!