hdu 4135 容斥原理
阿新 • • 發佈:2018-12-12
容斥中求指定區間內與n互素的數的個數問題,直接套模板solve(r)-solve(l-1)就是答案
#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; #define N 2300010 #define ll long long const int maxn=30005; const ll mod=1000000007; ll solve (ll n, ll r) { vector<ll> p; for (ll i=2; i*i<=n; ++i) if (n % i == 0) { p.push_back (i); while (n % i == 0) n /= i; } if (n > 1) p.push_back (n); ll sum = 0; for (ll msk=1; msk<(1<<p.size()); ++msk) { ll mult = 1, bits = 0; for (ll i=0; i<(ll)p.size(); ++i) if (msk & (1<<i)) { ++bits; mult *= p[i]; } ll cur = r / mult; if (bits % 2 == 1) sum += cur; else sum -= cur; } return r - sum; } int main(){ int t,ca=1; ll a,b,n; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld",&a,&b,&n); printf("Case #%d: %lld\n",ca++,solve(n,b)-solve(n,a-1)); } return 0; }