标签:
题目链接:
Time Limit: 6000/3000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll dp[1003],num[1003],p[1003][1003]; int n,a[1003]; const ll mod=1e8+7;//注意是8,比赛的时候这个地方直接wa到cry int gcd(int x,int y) { if(y==0)return x; return gcd(y,x%y); } int main() { for(int i=1;i<=1000;i++) { for(int j=i;j<=1000;j++) { p[i][j]=gcd(i,j); } } int t; scanf("%d",&t); while(t--) { for(int i=1;i<=1000;i++) { num[i]=0; } ll ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); for(int i=1;i<=n;i++) { dp[i]=(ll)a[i]; for(int j=1;j<=a[i];j++) { if(num[j]) { num[j]%=mod; dp[i]+=num[j]*p[j][a[i]];//压缩的地方 dp[i]%=mod; num[p[j][a[i]]]+=num[j]; num[p[j][a[i]]]%=mod; } } num[a[i]]++; ans+=dp[i]; ans%=mod; } cout<<ans<<"\n"; } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhangchengc919/p/5348422.html