标签:
2 1 3 1 5 1 1 11014 1 14409 9
Case 1: 9 Case 2: 736427HintFor the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).
#include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> #define min(a,b) a<b?a:b #define max(a,b) a>b?a:b #define Max 100005 #define LL __int64 using namespace std; LL sum[Max],tot; int p[Max][20]; int num[Max]; void init() { sum[1]=1; for(int i=2;i<Max;i++) sum[i]=i; for(int i=2;i<Max;i++) if(sum[i]==i) for(int j=i;j<Max;j+=i) sum[j]=sum[j]/i*(i-1); } void init2() { LL x,k,i,j; for( i=1;i<=Max;i++) { x=i;k=0; for(j=2;j<=sqrt(i);j++) { if(x%j==0){ while(x%j==0)x=x/j; // p[i].push_back(j); p[i][num[i]++]=j; } } if(x>1)p[i][num[i]++]=x; } } LL dfs(int n,int b,int x,int k) { LL ans=0; for(int i=x;i<k;i++) { ans+=b/p[n][i]-dfs(n,b/p[n][i],i+1,k); } return ans; } int main() { LL T,a,b,c,d,k; int i,j,t; init(); init2(); // printf("%I64d %I64d\n",sum[2],sum[3]); scanf("%I64d",&T); t=0; while(T--) { tot=0; t++; scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&k); printf("Case %d: ",t); if(k==0){printf("0\n");continue;} b=b/k; d=d/k; int m; m=min(b,d); d=max(b,d); b=m; for(i=1;i<=b;i++) tot=tot+sum[i]; for(i=b+1;i<=d;i++) { // printf("%d\n",p[i].size()); tot+=b-dfs(i,b,0,num[i]); } printf("%I64d\n",tot); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47321497