BNU 34975 剪纸 折线划分平面问题 大数模拟+规律

来源:互联网 发布:c语言源代码网站知乎 编辑:程序博客网 时间:2024/04/28 20:57

题目链接:点击打开链接

最多的情况就是每个直线和当前平面的所有直线都相交

设当前有x根直线

则加入一个type0的直线就能产生 x个交点,两个交点间的线段可以把一个平面划分成2个

就能增加x + 1个平面


再推广 若加入typeY 的直线 

先让Y++,表示加入直线的根数

就能增加 (x + 1) * Y -  (Y-1)

加完后 平面上的直线数就增加了Y :即 x+=Y


所以每次加入 X 根 Y类型的直线

则答案增加的情况就是:

Y++;

ans += (x +1) *Y - (Y-1)

ans += (x +1 + Y) * Y - (Y-1)

·

·

·

ans += (x+1 + (X-1)*Y) * Y - (Y-1)

然后化简一下就是

ans += x*Y +1

ans += (x+Y)*Y+1

·

·

·

ans+=(x+(X-1)*Y) *Y +1


发现ans一共加了 X 个1 然后第一部分是 Y * (等差数列)

再化简成

ans += X + Y*( ( x + x+(X-1)*Y ) * X / 2);

这样我们就能O(1) 算出 每增加一次 答案的增值

但是这里取模会出现问题

/2 的情况逆元可能不存在,

但能保证 ( x + x+(X-1)*Y ) * X 一定是偶数,所以用个大数直接进行运算。

import java.math.*;import java.util.*;import java.io.*;public class Main {    static BigInteger x1 = new BigInteger("1");    static BigInteger x2 = new BigInteger("2");    public void work() {        int T;        T = cin.nextInt();        while (T-- > 0) {            int n = cin.nextInt();            long mod = cin.nextLong();            long x = 0;            long ans = 1 % mod;            while(n-->0)            {                long X = cin.nextLong(), Y = cin.nextLong();                Y++;                BigInteger now = BigInteger.valueOf(2*x + (X-1)*Y);                now = now.multiply(BigInteger.valueOf(X));                now = now.divide(BigInteger.valueOf(2));                now = now.mod(BigInteger.valueOf(mod));                long tmp = now.longValue();                tmp *= Y; tmp%=mod;                tmp += X; tmp%=mod;                ans += tmp; ans %= mod;                x += X*Y%mod;                x %=mod;            }            ans = ans % mod;            System.out.println(ans);        }    }    Main() {        cin = new Scanner(System.in);    }    public static void main(String[] args) {        Main e = new Main();        e.work();    }    public Scanner cin;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信话费充多了怎么办 睫毛烫的太卷了怎么办 烫完睫毛太卷了怎么办 烫睫毛太卷了怎么办 用微信充话费充错了怎么办 微信给空号充话费了怎么办 微信充话费充错号码是空号怎么办 淘宝充流量不到账怎么办 微信退货不退款怎么办 京东话费交错号怎么办? 微信缴费错了怎么办 给手机充话费被退款怎么办 买到假货淘宝商家已关店怎么办 手机刷错系统了怎么办 苹果手机成砖了怎么办 苹果6p变砖头怎么办 苹果刷成石头了怎么办 苹果手机更新成了砖头怎么办 京东售后好慢怎么办 京东商品超过售后期怎么办 京东过了售后期怎么办 京东售后不处理怎么办 京东售后不让退货怎么办 天猫盒子遥控器丢了怎么办 淘宝店铺的客服不理人怎么办 淘宝假货下架了怎么办 淘宝不让发布本地生活服务了怎么办 淘宝删除差评后店家不返现怎么办 天猫店家迟迟不发货怎么办 淘宝下单后店家说缺货怎么办 用淘宝把话费冲到空号上怎么办 d速快递没有网点怎么办 京东买的货没收到怎么办 淘宝物流显示已揽件就是不动怎么办 淘宝查不到物流信息怎么办 快递物流信息更新错怎么办 淘宝上查不到物流怎么办 微信买的东西不给退怎么办 微信购物已收货怎么办 微信买东西不退怎么办 银行经营贷款资金回流怎么办