中文题目
wld有一个序列
a[1..n]
, 对于每个
1≤i<n
, 他希望你求出一个最小的j(以后用记号F(i)表示),满足
i<j≤n
, 使
aj
为
ai
的倍数(即aj mod ai=0),若不存在这样的j,那么此时令
F(i)=0
保证
1≤n≤10000,1≤ai≤10000
对于任意
1≤i≤n
, 且对于任意
1≤i,j≤n(i!=j)
,满足
ai!=aj
因为数字范围是1——10000,可以先打表,求出1——10000每个数的所有因子。
读入数列时,每读到一个新数,就检查之前的队列中他的因子的数量(可以开一个数组保存),统计之后将因子数量清零,避免被后面的数检查到。
打出来一万行的表太大了不让交2333,那就预先打好吧差别不大
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<stack>
#include<queue>
#include<fstream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define CLR(x) memset(x,0,sizeof(x))
#define SETMAX(x) memset(x,0x3f,sizeof(x))
#define SETNO(x) memset(x,-1,sizeof(x))
#define ll long long
#define eps 1e-6
#define pow2(x) ((x)*(x))
#define forto(i,n) for(int i=0;i<n;i++)
#define for1to(i,n) for(int i=1;i<=n;i++)
#define VI vector<int>
using namespace std;
const double PI=acos(-1.0);
#define INF 0x3f3f3f3f
#define NINF 0xbfffffff
using namespace std;
int A[11111][111];
int rem[11111];
int main()
{
cin.sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
CLR(A);
for(int i=1;i<=10000;i++)
{
for (int j=i;j<=10000;j+=i)
{
A[j][++A[j][0]]=i;
}
}
int n;
while (cin>>n)
{
CLR(rem);
int result(0);
for1to(i,n)
{
int tp;
cin>>tp;
for (int j=A[tp][0];j>0;j--)
{
result+=i*rem[A[tp][j]];
rem[A[tp][j]]=0;
}
rem[tp]++;
}
cout<<result<<endl;
}
return 0;
}