Pagini recente » Cod sursa (job #196928) | Cod sursa (job #2119572) | Cod sursa (job #98316) | Cod sursa (job #2258587) | Cod sursa (job #2399511)
#include <iostream>
#include <cstdio>
#include <vector>
#define B 1000000
using namespace std;
int n,x,m,l=1;
struct Numar{
vector <int> nr;
Numar(){
nr = vector <int>(1);
}
Numar(int val){
nr = vector <int>(1,val);
}
void aduna(Numar b){
vector <int> rez;
int t=0, len = min(nr.size(),b.nr.size());
for(int i = 0;i < len; ++i){
t += nr[i] + b.nr[i];
rez.push_back(t%B);
t/=B;
}
for(int i = len; i < nr.size(); ++i){
t += nr[i];
rez.push_back(t%B);
t/=B;
}
for(int i = len; i < b.nr.size(); ++i){
t += b.nr[i];
rez.push_back(t%B);
t/=B;
}
while(t){
rez.push_back(t%B);
t/=B;
}
nr = rez;
}
}dp[2][1005];
int cmmdc(int a, int b){
int r;
while(b){
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d%d", &n,&m);
dp[0][m]=Numar(1);
for(int i = 1;i < n; ++i){
scanf("%d", &x);
for(int j=1;j<=m;++j){
dp[l][j] = dp[!l][j];
dp[l][cmmdc(x,j)].aduna(dp[!l][j]);
}
dp[l][x].aduna(Numar(1));
m = max(m,x);
l=!l;
}
for(int i = 1; i < dp[!l][1].nr.size(); ++i)
printf("%6d", dp[!l][1].nr[i-1]);
cout<<dp[!l][1].nr.back();
return 0;
}