Topic Link: POINT here!!!
Test instructions
Give you two integers m (1<=m<=1e6), K (1<=k<=1e8). What is the number of K and M coprime?
Exercises
Direct two points + allowance.
Code:
#include <cstdio> #include <cstring> #include <iostream> #include <sstream> #include < algorithm> #include <vector> #include <bitset> #include <set> #include <queue> #include < stack> #include <map> #include <cstdlib> #include <cmath> #define PI 2*asin (1.0) #define LL Long long# Define PB push_back#define pa pair<int,int> #define CLR (A, B) memset (A,b,sizeof (a)) #define Lson lr<<1,l,mid# Define Rson Lr<<1|1,mid+1,r#define Bug (x) printf ("%d++++++++++++++++++++%d\n", x,x) #define Key_value Ch[ch[root ][1]][0]c:\program files\git\binconst ll MOD = 1e9+7;const ll N = 1e3+15;const int MAXN = 5e5+15;const int letter = 130;c Onst LL INF = 1e18;const double Pi=acos ( -1.0); const double eps=1e-10;using namespace Std;inline int read () {int x=0,f=1 ; Char Ch=getchar (); while (ch< ' 0 ' | | Ch> ' 9 ') {if (ch== '-') F=-1;ch=getchar ();} while (ch>= ' 0 ' &&ch<= ' 9 ') {x=x*10+ch-' 0 '; Ch=getchar ();} return x*f;} int X,k;int Vis[n],prime[n], Cnt=0;int ps[30],num;void init () {vis[1]=1; for (int i=2;i<n;i++) {if (!vis[i]) prime[++cnt]=i; for (int j=1;j<=cnt&&i*prime[j]<n;j++) {vis[i*prime[j]]=1; if (i%prime[j]==0) break; }}}ll Check (ll x) {///[1,x] LL sum=x,ans=1,res=0; int cc=0; for (int i=1;i< (1<<num); i++) {cc=0; LL Ans=1; for (int j=0;j<num;j++) {if (i& (1<<j)) {cc++; ANS*=1LL*PS[J]; }} if (cc%2) Res+=x/ans; else Res-=x/ans; } return sum-res;} int main () {init (); while (scanf ("%d%d", &x,&k)!=eof) {num=0; for (int i=1;i<=cnt;i++) {if (x%prime[i]==0) {while (x%prime[i]==0) x/=prime[i]; Ps[num++]=prime[i]; }} if (X!=1) ps[num++]=x; LL L=1,r=inf,mid; LL Flag; while (L<r) {mid= (l+r)/2; Flag=check (mid); if (flag<k) l=mid+1; else R=mid; } printf ("%i64d\n", R); } return 0;} /*12 4*/
poj2773 Happy 2006 (two points + tolerance)