思路:对于a<=x<=b,c<=y<=d,满足条件的结果为ans=f(b,d)-f(b,c-1)-f(a-1,d)+f(a-1,c-1)。

而函数f(a,b)是计算0<=x<=a,0<=y<=b满足条件的结果。这样计算就很方便了。

例如:求f(16,7),p=6,m=2.

对于x有:0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4

对于y有:0 1 2 3 4 5 0 1

很容易知道对于xy中的(0 1 2 3 4 5)对满足条件的数目为p。

这样取A集合为(0 1 2 3 4 5 0 1 2 3 4 5),B集合为(0 1 2 3 4)。

C集合为(0 1 2 3 4 5),D集合为(0 1)。

这样就可以分成4部分来计算了。

f(16,7)=A和C满足条件的数+A和D满足条件的数+B和C满足条件的数+B和D满足条件的数。

其中前3个很好求的,关键是B和D满足条件的怎么求!

这个要根据m来分情况。

#include<cstdio>
#include<iostream>
using namespace std;
#define ll __int64
ll p,m;
ll gcd(ll a,ll b)
{
if(a<b) swap(a,b);
while(b){
ll t=a;
a=b;
b=t%b;
}
return a;
}
ll f(ll a,ll b)
{
if(a<||b<) return ;
ll ma=a%p,mb=b%p,ans;
ans=(a/p)*(b/p)*p;//
ans+=(ma+)*(b/p)+(mb+)*(a/p);//2+3
if(ma>m){ //
ans+=min(m,mb)+;
ll t=(p+m-ma)%p;//根据ma求出满足最小的y来
if(t<=mb) ans+=mb-t+;
}else{
ll t=(p+m-ma)%p;//根据ma求出满足最小的y来
if(t<=mb) ans+=min(m-t+,mb-t+);
}
return ans;
}
int main()
{
int ca=,t;
ll a,b,c,d;
scanf("%d",&t);
while(t--){
cin>>a>>b>>c>>d>>p>>m;
ll ans=f(b,d)-f(b,c-)-f(a-,d)+f(a-,c-);
ll tot=(b-a+)*(d-c+);
ll g=gcd(ans,tot);
printf("Case #%d: %I64d/%I64d\n",++ca,ans/g,tot/g);
}
return ;
}

最新文章

  1. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
  2. Java集合框架
  3. uart与usart
  4. BZOJ 1046 上升序列
  5. 【转】 Android开发之EditText属性详解
  6. jvm在存储区域
  7. python中的数字
  8. XML预览
  9. Linux系统下常用的快捷键
  10. .net framework 4 线程安全概述
  11. 修改placeholder的值---input-placeholder
  12. MySQL binlog 组提交与 XA(两阶段提交)--1
  13. TCP连接异常断开检测(转)
  14. 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144
  15. Vue.js $nextTick
  16. wifidog 源码初分析(3)-转
  17. java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用
  18. Eclipse 工具下Maven 项目的快速搭建
  19. 软工之404 Note Found 队选题报告
  20. 【C++】指针和引用

热门文章

  1. 爬虫--Scrapy框架的基本使用
  2. python中赋值、浅拷贝、深拷贝详解(转)
  3. juery中监听input的变化事件
  4. 004ICMP-type对应表
  5. [ python ] 进程的操作
  6. Codeforces 799B - T-shirt buying(STL)
  7. css控制单行文本溢出
  8. js复制文字
  9. day4 装饰器深入解析
  10. 趣味js【练习题】