NC50554. 轻拍牛头
描述
输入描述
第一行包含一个整数N;
接下来第二到第N+1行每行包含一个整数。
输出描述
第一到第N行,第i行的输出表示第i头奶牛要拍打的牛数量。
示例1
输入:
5 2 1 2 3 4
输出:
2 0 2 1 3
说明:
第一头奶牛会拍第二、第三头奶牛,第二头牛不会拍任何奶牛的头,等等。C++14(g++5.4) 解法, 执行用时: 68ms, 内存消耗: 9464K, 提交时间: 2019-08-21 21:05:36
#include<bits/stdc++.h> using namespace std; int a[100005],b[1000005],ans[1000005]; int main(){ int n; scanf("%d",&n); memset(b,0,sizeof(b)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[a[i]]++; } for(int i=1;i<=1000000;i++){ if(b[i]){ for(int j=i;j<=1000000;j+=i) ans[j]+=b[i]; } } for(int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1); return 0; }
C++ 解法, 执行用时: 316ms, 内存消耗: 9076K, 提交时间: 2021-11-08 20:21:38
#include<iostream> using namespace std; int a[1000010],b[1000010],c[1000010]; int main() { int n,i,j; cin>>n; for(i=1;i<=n;i++) { cin>>c[i]; a[c[i]]++; } for(i=1;i<=1000010;i++) for(j=i;j<=1000010;j=j+i) b[j]+=a[i]; for(i=1;i<=n;i++) cout<<b[c[i]]-1<<endl; return 0; }