• hdu 1695 GCD


    // 题意: 给你区间[a,b] [c,d] 在两个区间各取一个数x,y,要求gcd(x,y)= k
    // 题目给的区间中说  0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000,
    // 真是不知道简便方法 后面看到 Yoiu can assume that a = c = 1 in all test cases. a,c是永远等于1的
    // 于是 相当于求 区间[1,b/k]和区间[1,d/k]中 互质数的对数
    // 假设 b<d 那么 b/k以前的就 sigmaphi[1..b/k] phi指的是欧拉函数
    // 大于 b/k 的每个数就用容斥原理进行操作
    #include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define LL __int64 //#define LL long long #define N 100010 struct node { int cnt; int pr[10]; }hs[N]; LL phi[N]; LL ans; void init() { int i,j; for(i=1;i<N;i++) phi[i]=i; for(i=2;i<N;phi[i]+=phi[i-1],i++ ) if(phi[i]==i) { for(j=i;j<N;j+=i) { phi[j]=phi[j]/i*(i-1); hs[j].pr[hs[j].cnt]=i; hs[j].cnt++; } } // printf("%I64d == ",phi[4]); } int b,d,k; void dfs(int deep,int n,int index,int val) { int t; for(int i=index;i<hs[n].cnt;i++) { t=val*hs[n].pr[i]; if(deep&1) ans=ans-(b/t); else ans=ans+(b/t); dfs(deep+1,n,i+1,t); } } int main() { int T; init(); scanf("%d",&T); for(int c=1;c<=T;c++) { scanf("%d %d %d %d %d",&b,&b,&d,&d,&k); // if(k==0){ printf("Case %d: 0 ",c);continue; } if(b>d) swap(b,d); b/=k; d/=k; // printf("%d %d",b,d); //ans=0; ans=phi[b]; for(int a=b+1;a<=d;a++){ ans+=b; dfs(1,a,0,1); // printf("%I64d ? ",ans); } printf("Case %d: %I64d ",c,ans); } return 0; }
  • 相关阅读:
    UltraEdit的配置
    字符编码笔记:ASCII,Unicode和UTF-8
    Hello World Hexo
    好久不见,味素
    记一次springboot+dubbo+zookeeper吐血的问题
    [深度学习]模型部署之优化
    [深度学习]pytorch部署之onnx
    count(*)、count(1)、count(column)
    like %和-的区别与使用
    SQL语言分类
  • 原文地址:https://www.cnblogs.com/372465774y/p/3619666.html
Copyright © 2020-2023  润新知