CF Gym102059 H. Fractions
生活随笔
收集整理的這篇文章主要介紹了
CF Gym102059 H. Fractions
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目要求找到給定區間的化簡后分子分母的和小于1000的數字的個數
我的想法是先找到所有的滿足要求的最簡分數(總數不超過1e6,而且遠小于),然后對詢問查找每個最簡分數出現的次數.
#include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typedef long long ll; const int INF=0x3f3f3f3f; const int MAXN=1e3+5; struct node {int x,y; }aa[MAXN*MAXN]; int tot;int gcd(int a,int b) {return b==0?a:gcd(b,a%b); }void init() {tot=0;for(int i=1;i<999;i++){aa[tot].x=1; aa[tot].y=i;tot++;}for(int i=2;i<999;i++){aa[tot].x=i; aa[tot].y=1;tot++;}for(int i=2;i<1000;i++){for(int j=2;j<1000;j++){if(i+j>=1000) break;if(gcd(i,j)!=1) continue;aa[tot].x=i; aa[tot].y=j;tot++;}} }ll A,B,C,D; ll ans,k1,k2,k3,k4;ll deal(ll a,ll b,ll c,ll d) {if(a>b || c>d) return 0;if(c>b || d<a) return 0;ll x=max(a,c);ll y=min(b,d);return y-x+1; }int main() {//freopen("data.in","r",stdin);init();while(~scanf("%lld%lld%lld%lld",&A,&B,&C,&D)){ans=0;for(int i=0;i<tot;i++){if(A%aa[i].x==0) k1=A/aa[i].x;else k1=A/aa[i].x+1;k2=B/aa[i].x;if(C%aa[i].y==0) k3=C/aa[i].y;else k3=C/aa[i].y+1;k4=D/aa[i].y;ll tmp=deal(k1,k2,k3,k4);if(tmp>0){ans+=tmp;//printf("%d/%d %d\n",aa[i].x,aa[i].y,tmp);}}printf("%lld\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的CF Gym102059 H. Fractions的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无精子症的检查项目有哪些
- 下一篇: CF Gym100917 C