若$a\leq 1000$,则整个$f$数列会形成$O(a)$段公差为$a$的等差数列。

否则$a^{-1}\leq 1000$,设$ai+b=f(i)$,那么有$i=a^{-1}f(i)-ba^{-1}$。

交换$i$和$f(i)$的地位,这将形成$O(a^{-1})$段公差为$a^{-1}$的等差数列。

暴力枚举两个等差数列,然后$O(1)$计算逆序对个数即可。

时间复杂度$O(\min(a,a^{-1})^2)$。

#include<cstdio>
typedef long long ll;
int n,m,lim,a,b,i,j,cnt;ll ans;
struct E{int s,l;}e[3000];
int pow(int a,int b){int t=1;for(;b;b>>=1,a=1LL*a*a%m)if(b&1)t=1LL*t*a%m;return t;}
void add(int s,int l){
if(lim){
if(s>lim)return;
if(!s){
s+=a,l--;
if(s>lim||l<0)return;
}
int t=(lim-s)/a;
if(l>t)l=t;
}
e[++cnt].s=s;e[cnt].l=l;
}
inline ll cal(const E&A,const E&B){
int L=(B.s-A.s)/a;
if(L<0)L=0;
while(1LL*a*L+A.s<=B.s)L++;
if(L>A.l)return 0;
int F=(a*L+A.s-B.s)/a;
while(1LL*a*(F+1)+B.s<a*L+A.s)F++;
if(F>B.l)F=B.l;
F++;
int R=(a*B.l+B.s-A.s)/a;
if(R<0)R=0;
while(1LL*a*R+A.s<=a*B.l+B.s)R++;
if(R>A.l)R=A.l;
int G=(a*R+A.s-B.s)/a;
while(1LL*a*(G+1)+B.s<a*R+A.s)G++;
if(G>B.l)G=B.l;
G++;
return 1LL*(F+G)*(R-L+1)/2+1LL*G*(A.l-R);
}
int main(){
scanf("%d%d%d%d",&n,&m,&a,&b);
if(a>1000)a=pow(a,m-2),b=1LL*(m-b)*a%m,lim=n,n=m-1;
if(lim)add(b,0);
while(n){
b=(b+a)%m;
i=(m-b-1)/a;
while(1LL*a*(i+1)+b<m)i++;
if(i>=n)i=n-1;
add(b,i);
n-=i+1;
b=(1LL*a*i+b)%m;
}
for(i=1;i<=cnt;i++)for(j=i+1;j<=cnt;j++)ans+=cal(e[i],e[j]);
return printf("%lld",ans),0;
}

  

BZOJ3565 : [SHOI2014]超能粒子炮的更多相关文章

  1. 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 95  Solved: 33[Submit][Statu ...

  2. Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Stat ...

  3. bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]

    4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...

  4. 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)

    [BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...

  5. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告

    P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...

  6. loj#2038. 「SHOI2015」超能粒子炮・改

    题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...

  7. bzoj 4591 超能粒子炮·改 - Lucas

    Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...

  8. BZOJ 4591 【SHOI2015】 超能粒子炮·改

    题目链接:超能粒子炮·改 这道题的大体思路就是用\(lucas\)定理,然后合并同类项,就可以得到一个可以递归算的式子了. 我们用\(S(n,k)\)表示答案,\(p\)表示模数(\(2333\)是一 ...

  9. bzoj4591 / P4345 [SHOI2015]超能粒子炮·改

    P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...

随机推荐

  1. python内置的魔术命令(builtin magic commands)

    在ipython或者jupyter notebook中,会出现"%"开头并且一个很短的命令,例如交互式的matlablib绘图: %matplotlib inline 之前一直不知 ...

  2. IIS中配置访问HTTPS

    1,新建网站,选中类型为 https,然后更改SSL证书为你配置的SSL证书, 对于SSL证书的配置是这样的 点开第二步,然后点击 创建自签名证书 确定以后点开网站看到有个SSL, 双击进去,再选中 ...

  3. jQuery中的extend()方法

    通常我们使用jquery的extend时,大都是为了实现默认字段的覆盖,即若传入某个字段的值,则使用传入值,否则使用默认值.如下面的代码: function getOpt(option){ var _ ...

  4. Select2 多层次赋值时异步赋值的问题

    场景: 当选择人员时加载人员,选择部门时加载部门.所以在人员下,选择人员A后,如果选择部门,会触发二级select 重新获取数据. 问题: 使用select2()方法进行绑定远程数据后,对第二个sel ...

  5. angular 4 开发环境下打包文件过大

    angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...

  6. 【bzoj3174】[Tjoi2013]拯救小矮人

    题解: 这题非常容易想到一个错误的贪心 就是按照ai排序 然后尽量取ai小的 但是有很明显的问题就是如果取了小的ai 那会导致那些原本可能存在这些ai就可以去掉的大的人因此不能取了 而有可能可以先去取 ...

  7. python全栈开发day92-day96 Vue总结

    -- ES6常用语法 -- var let const -- 模板字符串 -- 反引号 -- ${} -- 箭头函数 -- 普通函数取决于函数最近的调用者 -- 箭头函数取决当前环境 -- 类 -- ...

  8. 本地化KendoUI

    <!doctype html> <html>     <head>         <title>Kendo UI Web</title> ...

  9. docker 安装配置

    1. 安装docker 环境是ubuntu 14.04 参照:  https://help.aliyun.com/document_detail/60742.html # step 1: 安装必要的一 ...

  10. instance of的java用法

    http://blog.csdn.net/liranke/article/details/5574791