SPOJ 17125 TBATTLE - Thor vs Frost Giants(数论+尺取)
2017-04-10 16:03
417 查看
Description
给出一个长度为n的序列a[0],a[1],…,a[n-1],求最短子段使得该序列的乘积可以被n整除
Input
第一行一整数n,之后n个整数a[0],a[1],…,a[n-1]表示该序列(1<=n,a[i]<=1e5)
Output
输出最短子段的起始位置和终止位置
Sample Input
3
1 2 9
Sample Output
2 2
Solution
首先对n质因子分解,之后尺取法维护区间各因子的数量,如果有某个因子的数量不够就右端点右移,否则更新答案然后左端点右移,时间复杂度O(nlogn)
Code
给出一个长度为n的序列a[0],a[1],…,a[n-1],求最短子段使得该序列的乘积可以被n整除
Input
第一行一整数n,之后n个整数a[0],a[1],…,a[n-1]表示该序列(1<=n,a[i]<=1e5)
Output
输出最短子段的起始位置和终止位置
Sample Input
3
1 2 9
Sample Output
2 2
Solution
首先对n质因子分解,之后尺取法维护区间各因子的数量,如果有某个因子的数量不够就右端点右移,否则更新答案然后左端点右移,时间复杂度O(nlogn)
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 111111 int n,f[22],cnt[22],res,a[maxn][22],num[22]; bool check() { for(int i=0;i<res;i++) if(num[i]<cnt[i])return 0; return 1; } void update(int x,int v) { for(int i=0;i<res;i++) num[i]+=v*a[x][i]; } int main() { while(~scanf("%d",&n)) { res=0; int nn=n; for(int i=2;i*i<=nn;i++) if(nn%i==0) { f[res]=i,cnt[res]=0; while(nn%i==0)nn/=i,cnt[res]++; res++; } if(nn>1)f[res]=nn,cnt[res++]=1; for(int i=1;i<=n;i++) { int temp; scanf("%d",&temp); for(int j=0;j<res;j++) { a[i][j]=0; while(temp%f[j]==0)a[i][j]++,temp/=f[j]; } } memset(num,0,sizeof(num)); int ansl=-1,ansr=n+1,l=1,r=1; while(l<=n) { while(r<=n&&!check())update(r++,1); if(!check())break; if(r-l<ansr-ansl+1)ansl=l,ansr=r-1; update(l++,-1); } if(ansl==-1)printf("-1\n"); else printf("%d %d\n",ansl-1,ansr-1); } return 0; }
相关文章推荐
- SPOJ_TBATTLE:Thor_vs_Frost_Giants(数论+二分)
- SPOJ Thor vs Frost Giants 数论
- [SPOJ TBATTLE Thor vs Frost Giants]单调队列+质因子分解
- SPOJ TBATTLE - Thor vs Frost Giants [数论+二分]
- SPOJ 5161 FACVSPOW - Factorial vs Power(数论+二分)
- SPOJ FACVSPOW(数论+二分)
- SPOJ FACVSPOW 数论+二分
- 【数论】快速幂&&CODE[VS] 3500
- BZOJ_P1407&Codevs_P1747 [NOI2002]Savage(数论+扩展欧几里得)
- SPOJ - DIV15(数论)
- UVa 106/POJ 1305 Fermat vs. Pythagoras(数论&勾股数)
- 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational
- SPOJ ARCTAN (数论) Use of Function Arctan
- BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子
- neu 1694 Primorial vs LCM 数论
- 【转】【数论】【codevs】1012 最大公约数和最小公倍数问题
- BZOJ 2226: [Spoj 5971] LCMSum( 数论 )
- codevs1213 解的个数-----------数论/扩展欧几里得
- SPOJ FACVSPOW - Factorial vs Power
- 【基础练习】【数论/模拟】codevs1670 无穷的序列题解