1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include<bits/stdc++.h> using namespace std; typedef long long ll; #define mod 1000000007 #define inv2 500000004 const int Max=320000,Max_R=14000,cnt=5000; int tot=0,p[Max+5],flag[Max+5],dp[Max_R+5][cnt+5]; int ins(int x,int y) { return x+y>=mod?x+y-mod:x+y; } int des(int x,int y) { return x-y<0?x-y+mod:x-y; } void init() { for(int i=2;i<=Max;i++) if(!flag[i]) { p[++tot]=i; for(int j=2*i;j<=Max;j+=i)flag[j]=1; } dp[0][0]=0; for(int i=1;i<=Max_R;i++) { dp[i][0]=ins(dp[i-1][0],i); for(int j=1;j<=cnt;j++) dp[i][j]=des(dp[i][j-1],(ll)p[j]*dp[i/p[j]][j-1]%mod); } } bool check(ll n) { for(int i=1;i<=tot&&(ll)p[i]*p[i]<=n;i++) if(n%p[i]==0)return 0; return 1; } int DFS(ll n,int m) { if(n<2)return n; if(m==0) { n%=mod; return n*(n+1)%mod*inv2%mod; } if(n<=Max_R&&m<=cnt)return dp[n][m]; if(n<=p[m])return 1; return des(DFS(n,m-1),(ll)p[m]*DFS(n/p[m],m-1)%mod); } int main() { init(); int T,Case=1,pos; scanf("%d",&T); while(T--) { ll L,R,K; scanf("%I64d%I64d%I64d",&L,&R,&K); printf("Case #%d: ",Case++); if(!check(K))printf("0\n"); else if(K>Max) { if(K>=L&&K<=R)printf("%d\n",K%mod); else printf("0\n"); } else { for(pos=1;p[pos]<K;pos++); pos--; int ans=des(K*DFS(R/K,pos)%mod,K*DFS((L-1)/K,pos)%mod); printf("%d\n",ans); } } return 0; }
|