hdu 4961 因子
2014-08-19 21:30
204 查看
题意:
叙述好繁琐啊。
给你一个数列,a[i]
b[i],表示在前i项,如果有a[i]的倍数(靠近i的),那么b[i]就等于它了,如果没有找到,那么b[i]=a[i];
c[i],表示在i的后面项,如果有a[i]的倍数,那么c[i]就等于它了,如果没有找到,那么c[i]=a[i];
解法:
从前往后扫描一遍,如果这个数是前面某个数的因子,那么他就等于前面的某个数,如果不是就等于它本身,然后更新他的所有因子,使因子指向它。
同样的道理从后往前扫描一遍。
因为每部都会更新因子的指向,那么一定是更靠近所要找的数。
叙述好繁琐啊。
给你一个数列,a[i]
b[i],表示在前i项,如果有a[i]的倍数(靠近i的),那么b[i]就等于它了,如果没有找到,那么b[i]=a[i];
c[i],表示在i的后面项,如果有a[i]的倍数,那么c[i]就等于它了,如果没有找到,那么c[i]=a[i];
解法:
从前往后扫描一遍,如果这个数是前面某个数的因子,那么他就等于前面的某个数,如果不是就等于它本身,然后更新他的所有因子,使因子指向它。
同样的道理从后往前扫描一遍。
因为每部都会更新因子的指向,那么一定是更靠近所要找的数。
/************************************************************************* > File Name: 1002.cpp > Author: cy > Mail: 1002@qq.com > Created Time: 2014/8/19 14:05:36 ************************************************************************/ #include<iostream> #include<cstring> #include <algorithm> #include<cstdlib> #include<vector> #include<cmath> #include<stdlib.h> #include<iomanip> #include<list> #include<deque> #include<map> #include <stdio.h> #include <queue> #define maxn 100000+5 #define inf 0x3f3f3f3f #define INF 0x3FFFFFFFFFFFFFFFLL #define rep(i,n) for(i=0;i<n;i++) #define reP(i,n) for(i=1;i<=n;i++) #define ull unsigned long long #define ll long long #define cle(a) memset(a,0,sizeof(a)) using namespace std; int val[maxn]; int used[maxn]; int b[maxn]; int c[maxn]; vector<int>V[maxn]; void init() { int i,j,k; rep(i,maxn)V[i].clear(); V[i].clear(); for(i=1;i<=maxn;i++) { for(j=1;j*i<=maxn;j++) { V[i*j].push_back(i); } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); #endif int n; init(); while(scanf("%d",&n)) { if(n==0)break; int i,j,k; for(i=1;i<=n;i++) { scanf("%d",&val[i]); } cle(used); for(i=1;i<=n;i++) { if(used[val[i]]==0) { b[i]=val[i]; } else { b[i]=used[val[i]]; } for(j=0;j<V[val[i]].size();j++) { used[V[val[i]][j]]=val[i]; } } cle(used); for(i=n;i>=1;i--){ if(used[val[i]]==0) { c[i]=val[i]; } else{ c[i]=used[val[i]]; } for(j=0;j<V[val[i]].size();j++){ used[V[val[i]][j]]=val[i]; } } ll sum=0; for(i=1;i<=n;i++) { sum+=(ll)b[i]*(ll)c[i]; } printf("%I64d\n",sum); } return 0; }
相关文章推荐
- HDU 4961 Boring Sum(分解因子)
- hdu 5428 The Factor 找质因子
- hdu 4961 数论 o(nlogn)
- HDU 4961 Boring Sum 暴力
- hdu 1164(一个数的素数因子)
- hdu 4961
- HDU Largest prime factor && nyoj 520 最大素因子【素数】
- 数论——HDU 4961
- HDU-4961 Boring Sum (模拟)
- hdu 1299 数论 分解素因子
- hdu 1454 Happy 2004(数论,分解因子,乘法逆元,快速幂取模)
- HDU 1215 求N的因子之和
- hdu 2136(最大素数因子)
- hdu1299 Diophantus of Alexandria---素因子分解
- hdu 4961 Boring Sum
- 2014多校训练九(HDU 4960 HDU 4961 HDU 4965 HDU 4968 HDU 4969 HDU 4970)
- hdu 4961 Boring Sum(高效)
- hdu 4961 Boring Sum
- HDU 1452 Happy 2004 (因子和)
- hdu 2136Largest prime factor n的最大因子是第几个素数