ly 画了一个坐标系,里面有 n 个点,第 i 个点的坐标为 (xi,yi),现在她准备以 (0,0) 为圆心,画 n 个圆,每个圆会分别经过 n 个点中的一个。
现在 ly 希望从小到大画这些圆,所以她会先画半径最小的,再画半径第二小的...
当 ly 画第 i 个圆,这个圆经过的点编号为 j 时,她画这个圆需要花费的颜料消耗为这个 圆的半径2 * (i + j)
现在她希望知道她画完这 n 个圆需要消耗多少颜料
输入两行,第一行包含一个正整数 n (1 <= n <= 10^5),表示点数。
接下来 n 行,每行包含两个整数 (xi,yi)(1 <= xi,yi <= 10^6) 表示第 i 个点的坐标,保证任意两点离原点的距离不同
输出一行,为一个整数,为所求的答案。
由于答案可能很大,只需要输出答案对 1000000007 取模的结果即可
3
1 2
1 3
2 2
100
解析:结构体排序即可,结构体直接存R^2即可,因为计算反正是R^2,开方算出R再平方可能失精度。
- #include
- #include
- using namespace std;
- struct s
- {
- long long rf,id;//保存R^2和对应编号
- bool operator<(const s&x)const{
- return rf
//按照R^2从小到大排序 - }
- }a[100005];
- int main()
- {
- int n,i;
- long long x,y,s=0;
- scanf("%d",&n);
- for(i=1;i<=n;i++) scanf("%lld%lld",&x,&y),a[i].rf=x*x+y*y,a[i].id=i;
- sort(a+1,a+n+1);
- for(i=1;i<=n;i++) s=(s+a[i].rf*(i+a[i].id))%1000000007;//边算边取模
- printf("%lld\n",s);
- return 0;
- }