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

题目链接:点击打开链接

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

设当前有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;
}

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

时间: 2024-10-13 23:27:17

BNU 34975 剪纸 折线划分平面问题 大数模拟+规律的相关文章

hdu2050 折线分割平面

2n条直线划分平面总数为2n^2+n+1: 除去4n条边和2n个顶点后变成n条折线,由欧拉公式可得面数减少2n,即2n^2-n+1: #include<math.h> #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { int t,n; long long f[20001]; f[0]=1; for(int i=1; i<20001; i++) f[i]=f[

折线分割平面(图形递推题)

hdu 折线分割平面 (2050) Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input 输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(n大于0且n<=10000),表示折线的数量. Output 对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行. Samp

折线分割平面(递推)

折线分割平面 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input 输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量. Output 对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行. Sample Input 2 1

[hdu-2050] 折线分割平面

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15796    Accepted Submission(s): 10897 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平

hdu 2050 折线分割平面(递推公式)

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29965    Accepted Submission(s): 20289 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面

hdoj 2050 折线分割平面 【几何模板】

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17229    Accepted Submission(s): 11890 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平

折线切割平面

折线分割平面 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示.  输入 输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0< n<=10000),表示折线的数量. 输出 对于每个测试实例,请输出平面的最

HDU2050离散数学折线分割平面

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24505    Accepted Submission(s): 16644 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面

折线分割平面(杭电2050)(递归的几种类型,数学推导)

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17706    Accepted Submission(s): 12192 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平