bzoj4807 車

题目大意:

Description

众所周知,車是中国象棋中最厉害的一子之一,它能吃到同一行或同一列中的其他棋子。車跟車显然不能在一起打

起来,于是rly一天又借来了许多许多的車在棋盘上摆了起来……他想知道,在N×M的矩形方格中摆最多个数的車

使其互不吃到的情况下方案数有几种。但是,由于上次摆炮摆得实在太累,他为了偷懒,打算增加一个条件:对于

任何一个車A,如果有其他一个車B在它的上面(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)

棋子都是相同的。

Input

一行,两个正整数N和M。

N<=1000000,M<=1000000

Output

一行,输出方案数的末尾50位(不足则直接输出)。

Sample Input

2 2

Sample Output

1

Solution

题目看起来狠厉害的样子,但是仔细发现,

由于增加的那个条件非常的苛刻,并且車不能互相攻击到。

所以,最优情况下,一定是左上到右下斜着放下去。

假设n>=m

发现,在最优情况下,m列一定放满了,最优答案就是m。

然后,n行可能没有放满,所以,方案数就相当于,

在n行里面选择m行放置这m个棋子的方案数。

这就是C(n,m)呀!!

所以,方案数就是C(n,m)

但是,n<=1e6,输出又要保留50位,要用高精!!

首先,我们肯定不能按照一般运算顺序,

即先算n!,再算m!,(n-m)!。

就算是你愿意高精除以低精,

但是n!就已经位数估计7e6了。再循环n次?不可能。

但是,最后就要保留50位啊,那n!就每次取个余数,然后再用这个余数除以m!

纯粹瞎搞。取余运算哪里有这个运算律??

那么怎么办?

发现,困扰的地方就是除法。

如果只有乘法,没有除法,那么每次取最后50位就是可行的了。

怎么避免除法?

组合数一定是一个整数。所以n!的质因数分解后,肯定能消完分母的质因子分解情况。

先化简一下:

C(n,m)=(m+1)*.....*n/(1*....*(n-m)

线性筛素数。

把分母1~n-m依次用质数根号n质因数分解。

每个质因子维护一个桶,记录在分母中出现的次数。

之后,循环分子i,

把分子质因数分解,用分母中的质因子桶能消除一些质因子就消除。

最后留下的i可以高精乘进去。

(可以采用压位高精,快10倍)

虽然理论nsqrt(n),但是由于用质数分解更快,而且小数不用循环sqrt(n)次。

所以O(能过)

Code

/**************************************************************
    Problem: 4807
    User: 20011023
    Language: C++
    Result: Accepted
    Time:1332 ms
    Memory:17892 kb
****************************************************************/

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000000+5;
const ll mod=1e10;
int n,m;
int k;
int exi[N];
int ans;
int yue[N],has[N],cnt;
int pri[N],tot;
bool vis[N];
void sieve(){
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            pri[++tot]=i;
        }
        for(int j=1;j<=tot;j++){
            if(pri[j]*i>n) break;
            vis[pri[j]*i]=1;
            if(i%pri[j]==0) break;
        }
    }
}
void div1(int x){
    for(int i=1;pri[i]*pri[i]<=x;i++){
        while(x%pri[i]==0){
            exi[i]++;
            x/=pri[i];
        }
    }
    if(x>1){
        int k=lower_bound(pri+1,pri+tot+1,x)-pri;
        exi[k]++;
    }
}
int div2(int x){
    int now=x;
    for(int i=1;pri[i]*pri[i]<=x;i++){
        if(now%pri[i]==0){
            while(now%pri[i]==0){
                if(exi[i]){
                    exi[i]--;
                    x/=pri[i];}
                now/=pri[i];
            }
        }
    }
    if(now>1){
        int k=lower_bound(pri+1,pri+tot+1,now)-pri;
        if(exi[k]){
            exi[k]--;
            x/=pri[k];
        }
    }
    return x;
}
struct big{
    ll a[10];
    int cnt;
    void pre(){
        cnt=1,a[1]=1;
    }
    void mul(const ll &x){
        int ji=0;
        for(int i=1;i<=cnt;i++){
            a[i]=a[i]*x+ji;
            ji=a[i]/mod;
            a[i]%=mod;
        }
        if(ji){
            a[++cnt]=ji;
        }
        if(cnt>5) cnt=5;
    }
    void op(){
        while(a[cnt]==0&&cnt>1) cnt--;
        printf("%lld",a[cnt--]);
        while(cnt)printf("%010lld",a[cnt--]);
    }
}A;
void wrk(){
    A.pre();
    for(int i=m+1;i<=n;i++){
        int re=div2(i);
        A.mul(re);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    if(m>n) swap(n,m);
    if(n==m){
        printf("1");return 0;
    }
    else if(n==1){
        printf("%d",m);return 0;
    }
    else if(m==1){
        printf("%d",n);return 0;
    }
    sieve();
    for(int i=1;i<=n-m;i++){
        div1(i);
    }
    wrk();
    A.op();
    return 0;
}

Conclusion

质因数分解往往可以起到意想不到的优化,因为一个数的分解呈现了它的本质。

决定了一切的乘除,gcd,找因数等运算。

1.乘除,本质上是质因子次数的加减。

2.gcd本质上是所有质因子次数取min再相乘。lcm则取max

3.因数的产生本质上是一个乘法原理。质因子次数的选择也决定了因数的数值。

并且,处理一些gcd问题时,质因数分解的考虑方式也值得去尝试。

原文地址:https://www.cnblogs.com/Miracevin/p/9524307.html

时间: 2024-08-30 15:33:20

bzoj4807 車的相关文章

大品牌頭條:網約車今日開始推行,這裡是眼前各地信息匯總;蘋果運用商店參加付款寶買單;百勝巴哈馬今日在美推出

俺們每日清晨為你摘取最主要的商業新聞,一切興許改寫俺們生存的品牌都在其列.網約車新政new balance 997.5今日開始要進行了網約車統治方法今日起開始施行 .當前已然有 58 個都會.四個省宣告了地區履行的細則法令.俺們匯總了國家都會的細則境況和司機和租車廠家的反映, 點這裡看實際細節 (這篇日誌會在繼續更新各地戰略轉變景況).在徵求主張後,調理施行細則的有瑞安和麗水.寧波減少了戶籍,同意唯有棲居證的司機上路.而衢州強化了車齡限制,不應許車齡趕上兩年的車上路.兩個鄉鎮都給了四個月的過渡期

小車托運找誰好?專業長沙小車托運公司國聯物流就不錯-經營快訊-國聯物流-大件運輸專傢

[長沙物流公司編輯部 訊]長沙客戶何先生最近一直在為找一傢好的小車托運公司而發愁?不知道該找哪傢好?最後在朋友的介紹下,來到了我們專業長沙小車托運公司國聯物流,順利的解除了他的煩惱,自己的小車在國聯物流的幫助下安全的送達至崑明.       長沙何先生要托運的是一輛BYD S6越埜車,是要從長沙托運到崑明.何先生為什麼發愁呢?是因為在來到我們國聯之前,他就通過網絡途徑找到了很多傢物流公司,了解到要不就是不能提供小車托運服務,要不就是價格令他不滿意,再就是在貨物保障這一塊讓他不是很放心,直到他從朋

汽車托運 國聯物流 承諾給你最安全的運輸-經營快訊-國聯物流-大件運輸專傢

[長沙物流公司編輯部 訊]11月28日,沈先生通過網絡搜索"汽車托運",訪問了我們專業長沙汽車托運公司國聯物流官網(www.golion.com.cn),從官網中了解到,我們國聯物流對汽車托運有很豐富的經驗,還有真實的托運案例和圖片展示,所以馬上聯係了我們國聯物流客服熱線:40-0056-580.       沈先生緻電告知客服,他有一輛起亞轎車要從長沙發往長春,サッカースパイク,詢問具體要多少費用?需要多少天能到?具體汽車托運流程是怎樣的?得知了客戶的需求後,我司專門負責汽車托運的事

成功大數據團隊的「三駕馬車」

對於那些著手嘗試大數據應用的企業來說,成敗的關鍵是組建一個優秀的大數據團隊,但是不要指望一個「首席數據官(CDO)」或者數據科學家搞定所有的事情,成功的大數據團隊需要三駕馬車:一位業務分析師.一位機器學習專家和一位數據工程師.隨著報表軟體企業應用的火熱開展,數據科學家正在鬧人才荒,可謂一將難求,但是Lithium公司的首席科學家Michael Wu博士在接受IW採訪時表示:數據科學家的人才荒是因為人們對數據科學家的期望值過高,希望他即懂業務也懂最先進的大數據技術,這樣的人才自然是奇貨可居,而且不

學習 React.js:用 React.js 和 Flux 創建一個簡單的購物車

Creating A Simple Shopping Cart with React.js and Flux Ken Wheeler (@ken_wheeler) 簡介 歡迎來到學習 React 的第四章這也是最後一章!到現在,我們已經學習了怎樣利用 React 的 API 來創建狀態型組件,如何應用它們,以及如何運用臉書的 Flux 架構來工作的 今天我們將把所有的這一切放到一塊,來創建一個簡單的購物車應用.在現在的電商網站上,產品的詳細頁面相互依賴,而 React 有助於簡化並有效的組織它們

專車合法性遭“質疑” 服務雖好隱患多

“賓士寶馬隨便叫,真心尊貴又親民.”“生平第一次感受到專車服務,服務真是棒極了!下車後師傅還幫我打傘拎包,有種再也不需要男朋友的感覺.”網路上不少網友曬出自己坐專車的感受,點贊頻頻. “服務特別好,上下車幫忙開門不說,服務態度特耐心.”北京市民周婷說,專車很舒適,因為使用了專用打車劵,即便選擇豪華車也就貴了幾元錢mask house 面膜 好用 . 不少市民認為,大城市出行難已廣受詬病,計程車行業又難以及時提供服務,專車的出現有效解決了緊急情況下的打車難困境,還可以滿足大家的多樣化需求,對於生活

CH6802 車的放置

6802 車的放置 0x60「图论」例题 描述 给定一个N行M列的棋盘,已知某些格子禁止放置.问棋盘上最多能放多少个不能互相攻击的車.車放在格子里,攻击范围与中国象棋的"車"一致.N,M≤200. 输入格式 第一行为n,m,t(表示有t个禁止的格子) 第二行到t+1行为x,y,分别表示禁止格子所在的位置,x为第x行,y为第y列,行列编号从1开始. 输出格式 一个整数,表示最多能放多少个車. 样例输入 8 8 0 样例输出 8 题解 把行.列看成节点 1要素:行节点.列节点只能放一个 0

車设计模式之单例

单例的作用很多:方便其他类的访问,控制物体的生成和销毁,确保class只有一个节省内存. 在unity里使用单例是游戏很常见的行为,如果继承了monobehaviour的话.直接在Awake里赋值单例在大部分情况下就够用了 而一般没有继承mono的话,则可用以下的方式实现

【2018.9.20】JOI 2017 Final T2「準急電車 / Semiexpress」

日文原题 题目描述 JOI 铁路公司是 JOI 国唯一的铁路公司. 在某条铁路沿线共有 $N$ 座车站,依次编号为 $1...N$. 目前,正在服役的车次按照运行速度可分为两类:高速电车(简称快车)与普通电车(简称慢车). 慢车每站都停.乘慢车时,对于任意一座车站 $i(1?i<N)$,车站 $i$ 到车站$ i+1$ 用时均为 $A$. 快车只在车站 $S_1, S_2, \ldots, S_M$?? 停车 $(1=S_1<S_2<\cdots<S_M=N)$.乘快车时,对于任意