51nod 1643 小Q的家庭作业
题意:
f(n) = sigma(gcd(i,n)) 1 <= i <= n
g(n) = sigma(f(d)) d | n
n = x1 * x2 * ... * xm
其中 x[i+1] = (a * x[i] + b) % c + 1
1 <= m <= 10^18
1 <= c <= 10^7
1 <= x[1],a,b <= c
首先,发现f,g函数都是积性函数
并且推下公式:g[n] = n * (k1 + 1 ) * (k2 + 1) * ...
n = p1^k1 * p2^k2 * ....
复杂度O(c) = O(10^7)
公式很容易推,这道题主要是空间太少了,开了数组最后都只能去掉,一个数组使用多次
然后时限也很紧,1300ms,用C++11交了好几发,一直是1400ms左右,改为C++交就1062ms了,
这个要注意
还有个地方,+0LL 被我打成 +1LL,还一直没有发现,wa了好多发。。
代码:
//File Name: nod1643.cpp
//Author: long
//Mail: 736726758@qq.com
//Created Time: 2016年12月22日 星期四 17时15分27秒 #include <bits/stdc++.h>
#define LL long long
const int MAXN = + ;
const int N = + ;
const int P = (int)1e9 + ;
int fir[MAXN],prime[MAXN],num[MAXN];
LL g,m,x,a,b,c;
int tot,C;
LL qp(LL x,LL y){
LL res = ;
for(;y>;y>>=){
if(y & ){
res = res * x;
if(res >= P)
res %= P;
}
x = x * x;
if(x >= P) x %= P;
}
return res;
}
void init(){
memset(fir,-,sizeof(fir));
tot = ;
for(int i=,j;i<MAXN;++i){
if(fir[i] == -){
prime[tot++] = i;
fir[i] = tot - ;
}
for(j=;j<tot;++j){
if((LL)i * prime[j] >= MAXN) break;
fir[i * prime[j]] = j;
if(i % prime[j] == ) break;
}
}
}
void cal_num(){
// memset(prime,0,sizeof(prime));
prime[x] = ,num[x] = ,fir[] = x;
C = x;
g *= x;
LL l = ,r = ,len = ;
for(LL i=;i<=m;++i){
x = (a * x + b) % c + ;
if(x > C) C = x;
// printf("i = %d x = %lld\n",i,x);
if(!prime[x]){
++num[x];
prime[x] = i;
fir[i] = x;
g = g * x;
if(g >= P) g %= P;
}
else{
l = prime[x],r = i;
len = r - l;
break;
}
}
if(r){
int rest = (m - r + ) % len + l - ;
LL dive = (m - r + ) / len;
LL u = ,v = ,w = dive % P,tmp;
for(LL i=l,now;i<r;++i){
now = w;
v = fir[i];
u = u * v;
if(u >= P) u %= P;
if(i <= rest){
++now;
g = g * v;
if(g >= P) g %= P;
}
tmp = num[v] + now;
if(tmp >= P) tmp -= P;
num[v] = tmp;
}
g = g * qp(u,dive);
if(g >= P) g %= P;
}
}
void cal_sum(LL c){
for(LL i=c,id,p,u;i>;--i){
if(!num[i]) continue;
if(prime[fir[i]] == i){
g = g * (num[i] + 1LL);
if(g >= P) g %= P;
}
else{
id = fir[i];
p = prime[id];
u = num[p] + num[i];
if(u >= P) u -= P;
num[p] = u;
u = num[i / p] + num[i];
if(u >= P) u -= P;
num[i / p] = u;
}
}
}
void solve(){
g = ;
cal_num();
init();
cal_sum(C);
}
int main(){
scanf("%lld %lld %lld %lld %lld",&m,&x,&a,&b,&c);
solve();
printf("%lld\n",g);
return ;
}
51nod 1643 小Q的家庭作业的更多相关文章
- 51Nod 欢乐手速场1 C 开心的小Q[莫比乌斯函数]
开心的小Q tangjz (命题人) quailty (测试) 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的 ...
- BZOJ4018: 小Q的幻想之乡
Description 背景 有一天,小Q梦见自己来到了理想国的幻想之乡. 描述 有一天,小Q梦见自己来到了理想国的幻想之乡.幻想乡有无穷户居民,第i个家庭住在编号为i的房屋里,编号从1开始,到正无穷 ...
- 51nod 1471 小S的兴趣 | 分块 链表
51nod 1471 小S的兴趣 题面 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题 ...
- 平面直接坐标系线段相交问题(小Q(钟神)的问题)
[问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...
- 深入理解计算机系统家庭作业汇总 20135301&&20135328
深入理解计算机系统家庭作业 深入理解计算机系统第二章家庭作业 题目2.64 题目要求 判断二进制数偶数位是否有任意一位位为1,有的话返回1,否则返回0 解题过程 int any_even_one(un ...
- hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)T ...
- HD4505小Q系列故事——电梯里的爱情
Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...
- hdu4505小Q系列故事——电梯里的爱情
小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- HDU-4515 小Q系列故事——世界上最遥远的距离
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...
随机推荐
- 使用自定的Adapter绑定ListView/GridView数据
使用自定的Adapter绑定ListView/GridView数据(地址) 对于ListView/Gridview的数据绑定, google提供了一些Adapter的模板, 自己也可以自定义一些个性化 ...
- 如何查看PYTHON Django的保存路径
如何查看PYTHON Django的保存路径 $ python -c " import sys sys.path = sys.path[1:] import django print(dja ...
- CloudStack中云主机的UTC时间转为本地时间
CloudStack项目中使用的时间是UTC时间,具体什么是UTC时间大家可以百度,但是我们需要的时间是正常的时间,所以在国泰君安开发测试云中,同步资源管理中虚拟机的同步管理,需要对虚拟机的时间格式化 ...
- 用GO扫描图片像素,复制图片
关键是使用image.image/png.image/color包 // main.go package main import ( "fmt" "bufio" ...
- Apache2 同源策略解决方案 - 配置 CORS
什么是同源策略 现在的浏览器大多配有同源策略(Same-Origin Policy),具体表现如下: 浏览某一网站,例如 http://www.decembercafe.org/.这个网页中的 Aja ...
- WinForm DataGridView根据选中的复选框删除
注意:在DataGridView添加一列(name:delete),ColumnType属性为:DataGridViewCheckBoxColumn,FlaseValue属性为:Flase,TureV ...
- 优先队列 :Priority Queue
PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列.优先级队列是不同于先进先出队列的另一种队列. 每次从队列中取出的是具有最高优先权的元素.如果 ...
- 粗略了解struts2
花了半天的时间再把struts2详细拟了一遍,之前用习惯了servlet加jsp,再看struts2的时候终于明白为什么大家都愿意学,以人类天生的惰性,要让他们愿意去学习一个新的东西,这东西一定可以让 ...
- Unix系统小知识(转)
Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
- 如何分析解决Android ANR
来自: http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/detail ...