题意:

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的家庭作业的更多相关文章

  1. 51Nod 欢乐手速场1 C 开心的小Q[莫比乌斯函数]

    开心的小Q tangjz (命题人) quailty (测试)   基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的 ...

  2. BZOJ4018: 小Q的幻想之乡

    Description 背景 有一天,小Q梦见自己来到了理想国的幻想之乡. 描述 有一天,小Q梦见自己来到了理想国的幻想之乡.幻想乡有无穷户居民,第i个家庭住在编号为i的房屋里,编号从1开始,到正无穷 ...

  3. 51nod 1471 小S的兴趣 | 分块 链表

    51nod 1471 小S的兴趣 题面 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题 ...

  4. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...

  5. 深入理解计算机系统家庭作业汇总 20135301&&20135328

    深入理解计算机系统家庭作业 深入理解计算机系统第二章家庭作业 题目2.64 题目要求 判断二进制数偶数位是否有任意一位位为1,有的话返回1,否则返回0 解题过程 int any_even_one(un ...

  6. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  7. HD4505小Q系列故事——电梯里的爱情

    Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...

  8. hdu4505小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  9. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

随机推荐

  1. 基于IE内核的浏览器:WebBrowser上的网页与Winform本身交互[Demo下载]

    http://blog.udnz.com/Article/Invoke_Javascript_On_Webbrowser_In_Winform.aspx C# 中调用 网页上的 Javascript ...

  2. 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.

    刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.

  3. JDK1.7 安装配置

    JDK1.7 安装配置 1.下载jdk1.7安装包,下载地址为http://pan.baidu.com/s/1bnvWc5x: 2.安装jdk1.7,安装完成后可在安装目录下看到以下两个文件夹,如下图 ...

  4. linux git 推送空文件夹

    /********************************************************************************* * linux git 推送空文件 ...

  5. 在Sublime Text 3 中安装SublimeLinter,Node.js进行JS&CSS代码校验

    转载自:http://www.wiibil.com/website/sublimelinter-jshint-csslint.html 在Sublime Text中安装SublimeLinter,No ...

  6. python 输出十六进制中文乱码

    代码中红色字体为解决方案: #-*-coding:utf-8-* import csv filename='C:\Users\yaru\Desktop\Senti_Value(1).csv' data ...

  7. Android下载更新代码

    其实是昨天反编译一个apk,给它添加一个自动更新的功能用到的.为了在smali下方便查看,代码写的不规范,反正到了smali都一个吊样~~~~ 权限: <uses-permission andr ...

  8. php字符串处理函数大全

      addcslashes - 为字符串里面的部分字符添加反斜线转义字符addslashes - 用指定的方式对字符串里面的字符进行转义bin2hex - 将二进制数据转换成十六进制表示chop - ...

  9. linux的压缩命令

    gzip: Linux压缩保留源文件的方法: gzip –c filename > filename.gz Linux解压缩保留源文件的方法: gunzip –c filename.gz > ...

  10. c#网络编程

    c#网络编程 1.system.net命名空间 DNS类:DNS类包含了许多的方法,总结起来常用的就是获取获取主机地址,获取主机名,根据地址 获取DNS主机信息,根据主机名获取DNS信息: IPadd ...