Ned的难题
题目描述
Ned再也看不下去Robert的种种恶习,于是他决定出一道题来让他醒悟。
Ned的题目是这样:
给出一个有n个数的序列,求其中所有连续子序列的数的最大公因数的乘积模1000000009的值。
Robert当时就立刻给出了一个超级无敌速度无人能及的O(1)错误解法。
既然Robert不会做,Ned决定让你来做出这题来证明Robert不应颓废下去。
输入
第一行一个正整数n(1≤n≤50000)
第二行n个正整数a[i](1≤a[i]≤10000000)
输出
一行一个整数表示序列中所有连续子序列的数的最大公因数的乘积模1000000009的值
样例输入
3
4 6 2
样例输出
384
样例解释
gcd(4,6,2)*gcd(4,6)*gcd(6,2)*gcd(4)*gcd(6)*gcd(2)=2*2*2*4*6*2=384
数据范围
对于20%的数据:
1≤n≤1000
对于额外20%的数据保证不存在长于2000的数列的最大公约数大于一
对于100%的数据:
1≤n≤50000
1≤a[i]≤10000000
【题解】
(题外话:考试时我不记得求一群数的最大公约数怎么弄了。。。下考后发现我智障了:不就是先求两个数的最大公因数,再拿求出的数与第三个数求最大公因数吗!!!)
所以某个质数p对答案的贡献跟一个子序列里这个质数的次数的最小值有关,即p^min(a[i]),观察到最终求的是gcd的乘积,所以,我们可以现将所有数分解质因数,然后对于一个质数对某个区间的答案的贡献,其实就是这个区间内这个质数的次数的最小值,所以我们可以用笛卡尔树加上快速幂来解决,时间复杂度O(8nlogn)(注,有常数8是因为每个小于10^7数最多可以被分成八个不同的质因数)。
然而出题人的题解也太高大上了吧。。。笛卡尔树是什么毛线???
于是我就想出了一种鬼畜的解法:
从前往后求1~i序列的最大公约数n,当前搜到了i,若搜到一个数时,序列的最大公约数突然变成n/j,则说明1~i-1中j为该序列的公约数,然后这i-1个数中必定有(i-1)* (i-1-1)/2对公约数中有此数,因此答案可乘上这个数的(i-1)*(i-1-1)/2次方(快速幂),再把这i-1个数除上j即可。
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int mod=1e9+9;
ll n,a[50005]={},ans=1;
ll gcd(ll a,ll b)//求最大公约数
{
return a==0?b:gcd(b%a,a);
}
ll Pow(ll a,ll b)//快速幂
{
if(b==1)return a;
ll s=Pow(a,b>>1);
s=s*s%mod;
if(b&1) s=s*a%mod;
return s;
}
il ll gi()
{
re ll x=0;
re ll t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
freopen("ned.in","r",stdin);
freopen("ned.out","w",stdout);
n=gi();
fp(i,1,n)
a[i]=gi();
a[++n]=1;//有一种情况:搜到最后时,gcd不为0,这时未加特判的程序会直接退出,留下公约数没处理
ll gg,ggg;
fp(i,1,n)
{
if(a[i]==1) continue;
ll cnt=1;
gg=a[i];
fp(j,i+1,n)
{
cnt++;
ggg=gcd(min(gg,a[j]),max(gg,a[j]));
if(gg!=ggg)
{
ll tt=gg/ggg;
ans=ans*Pow(tt,cnt*(cnt-1)/2)%mod;
fp(k,i,j-1) a[k]/=tt;
gg=ggg;
}
if(ggg==1) break;//没必要再看了,都互质了
}
}
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}
Ned的难题的更多相关文章
- Ned 的难题
题目描述 Ned 再也看不下去 Robert 的种种恶习, 于是他决定出一道题来让他醒悟. Ned 的题目是这样: 给出一个有 n 个数的序列, 求其中所有连续子序列的数的最大公因数的乘积模 1000 ...
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- 探讨webapp的SEO难题(上)
前言 网络蜘蛛无法解析javascript,至少百度是不能的,神马搜索差的更远,而我们的webapp的渲染展示完全由javascript驱动 所以蜘蛛访问webapp页面会得到一个白页面,比如,我们期 ...
- hduoj 1251 统计难题
http://acm.hdu.edu.cn/showproblem.php?pid=1251 统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory ...
- FZU 1686 神龙的难题 (重复覆盖)
Problem 1686 神龙的难题 Accept: 397 Submit: 1258Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- HDU 1251统计难题
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- hdu1251 统计难题
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1251 题目: 统计难题 Time Limit: 4000/2000 MS (Java/Othe ...
- UOJ #10 pyx的难题
pyx的难题 被这题搞得生无可恋. 容易看出 题目完成时间与优先级之间的关系是单调的,故可以二分答案. 用于二分的答案可以取\(O(n)\)个离散值, 这样就很方便地保证了优先级各不相同. 可以用优先 ...
随机推荐
- ruby学习之路(一)
学习ruby最好的方法就是下载源码包,里面带有sample和test,是入门学习的最好实例. 我下载的是2.1.0版本,首先./configure,然后make,sudo make install.从 ...
- 通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发
前面已经讲过2篇基于docker的mysql.redis容器编排并启动.这次将练习下nginx的docker方式的部署,以及通过nginx去代理宿主主机上的Web服务应该怎么配 PS:(这里由于ngi ...
- Java对象序列化为什么要使用SerialversionUID
1.首先谈谈为什么要序列化对象 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通 ...
- python list排序(正倒)以及获取重复数据
mylist = [2,2,2,2,5,5,7,2,2,3,3,3,3] #<class 'list'>: [2, 2, 2, 2, 5, 5, 7, 2, 2, 3, 3, 3, 3] ...
- 洛谷 1097 统计数字(NOIp2007提高组T1)
[题解] 排个序然后扫一遍进行统计即可. #include<cstdio> #include<algorithm> #include<cstring> #defin ...
- 充当别的mcu的外部存储器(51类)
// 锁存地址 - STC12C5A60S2 reg [15:0]rAddr_51; //存放51单片机传过来的地址 读51地址寄存器 always @ (posedge MCLKout or neg ...
- lombok 插件安装
1. 下载地址: https://plugins.jetbrains.com/plugin/6317-lombok-plugin 2. 选择从本地安装.
- java nio--采用Selector实现Socket通信
server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...
- [codeVS1404] 字符串匹配
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度. ...
- MyBatis3-缓存使用
一级缓存和二级缓存的区别: 1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为同一个SqlSession,当Session flush或close之后,该Sessi ...