zoukankan      html  css  js  c++  java
  • Ural 1091 Tmutarakan Exams

    Tmutarakan Exams

    Time Limit: 1000ms
    Memory Limit: 16384KB
    This problem will be judged on Ural. Original ID: 1091
    64-bit integer IO format: %lld      Java class name: (Any)
     
    University of New Tmutarakan trains the first-class specialists in mental arithmetic. To enter the University you should master arithmetic perfectly. One of the entrance exams at the Divisibility Department is the following. Examinees are asked to find K different numbers that have a common divisor greater than 1. All numbers in each set should not exceed a given number S. The numbers K and S are announced at the beginning of the exam. To exclude copying (the Department is the most prestigious in the town!) each set of numbers is credited only once (to the person who submitted it first).
    Last year these numbers were K=25 and S=49 and, unfortunately, nobody passed the exam. Moreover, it was proved later by the best minds of the Department that there do not exist sets of numbers with the required properties. To avoid embarrassment this year, the dean asked for your help. You should find the number of sets of K different numbers, each of the numbers not exceeding S, which have a common divisor greater than 1. Of course, the number of such sets equals the maximal possible number of new students of the Department.
     

    Input

    The input contains numbers K and S (2 ≤ K ≤ S ≤ 50).
     

    Output

    You should output the maximal possible number of the Department's new students if this number does not exceed 10000 which is the maximal capacity of the Department, otherwise you should output 10000.
     

    Sample Input

    3 10
    

    Sample Output

    11
    

    Source

     
    解题:容斥原理
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn = 52;
     5 LL c[maxn][maxn];
     6 int p[] = {2,3,5,7,11,13,17,19,23,29};
     7 void init() {
     8     c[0][0] = 1;
     9     for(int i = 1; i < maxn; ++i) {
    10         c[i][0] = c[i][i] = 1;
    11         for(int j = 1; j < i; ++j)
    12             c[i][j] = c[i-1][j] + c[i-1][j-1];
    13     }
    14 }
    15 int main() {
    16     init();
    17     int k,s;
    18     while(~scanf("%d%d",&k,&s)) {
    19         LL ret = 0;
    20         for(int i = 0; i < 10; ++i) {
    21             if(s/p[i] < k) {
    22                 for(int j = 1; j < (1<<i); ++j) {
    23                     int cnt = 0;
    24                     LL tmp = 1;
    25                     for(int t = 0; t < i; ++t) {
    26                         if((j>>t)&1) {
    27                             cnt++;
    28                             tmp *= p[t];
    29                         }
    30                     }
    31                     if(cnt&1) ret += c[s/tmp][k];
    32                     else ret -= c[s/tmp][k];
    33                 }
    34                 break;
    35             }
    36         }
    37         printf("%I64d
    ",ret > 10000?10000:ret);
    38     }
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    [导入]在.NET下如何实现密码Hash化
    [导入]强大的.NET反编译工具Reflector及插件
    [导入]XML数据岛(XML Data Island)
    验证视图状态 MAC 失败。处理办法
    ASP.NET格式化字符串
    .NET 开发框架技术资料搜集
    网页中图片大小自动调整三种方法
    用户 'azhk' 登录失败。原因: 未与信任 SQL Server 连接相关联。
    jstl及el表达式笔记
    杰普Core Java课程笔记1
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4847292.html
Copyright © 2011-2022 走看看