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)\)个离散值, 这样就很方便地保证了优先级各不相同. 可以用优先 ...
随机推荐
- js读写txt文件
view plain<script language="javascript" type="text/javascript"> //读文件funct ...
- 26-Ubuntu-文件和目录命令-其他命令-管道
管道 Linux允许将一个命令的输出可以通过管道作为另一个命令的输入. 可以理解为现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里的 | 左右分为两端,左端塞东西(写),右端取东西(读). ...
- Linux常用命令——关机与重启命令
1.shutdown命令 shutdown [选项] 时间 --使用shutdown进行关机或重启会正确保存正在使用的服务,其他命令有一定的危险性,建议最好使用shutdown命令进行关机重启 选项: ...
- Tensorflow学习笔记(1):tf.slice()函数使用
tensorflow 当中的一个常用函数:Slice() def slice(input_, begin, size, name=None) 函数的功能是根据begin和size指定获取input的部 ...
- Diango REST framework 视图继承图
- python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...
- angular中处理多个异步请求的方法汇总
在实际业务中经常需要等待几个请求完成后再进行下一步操作.但angularjs中$http不支持同步的请求. 解决方法一: $http多层嵌套 $http.get('url1').success(fun ...
- STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)
本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样 ...
- __setitem__() __getitem__() __delitem__()
#item系列 和对象使用[]访问值有联系 #obj={'k':'v'} #print(obj) #print(obj['k']) class B: def __getitem__(self, ite ...
- spring boot & JsonParser
spring boot https://stackoverflow.com/questions/29313687/trying-to-use-spring-boot-rest-to-read-json ...