2016-NJUST-count number

     一次又一次的WA,是得到更好的AC的必经之路。


首先附上题目链接,当时并没有做出来,总感觉和欧拉函数有关,然而并没有用上,上网一搜,才发现竟然是容斥原理的入门题,天啊,这个都还没学,看来平时自己的积累才是王道,学习要主动,加油!!!


咦,为何题目图片传不上来。。。。。。


算了,直接上代码了

#include
   
   
    
    
#include
    
    
     
     
#define N 10000000


using namespace std;


int prime[N],cnt=0;
void creat_prime(int n)         //欧几里得算法 求 输入n所有的质因数
{
    int i;
    for(i=2;i*i<=n;i++){
        if(n%i==0){
            prime[cnt++]=i;
            while(n%i==0){
                n/=i;
            }
        }
    }
    if(n>1) prime[cnt++]=n;
}


int fun(int up)                     //求从 1-UP   内, 与n有 公因子 的 数字 的数量
{
    int c,i,j,tp,sum=0;
    for(i=1;i<(1<
     
     
      
      < cnt;j++){       // 循环所有因子
            if(i & (1<
      
      
       
       >T;
    while(T--){
        cin>>a>>b>>n;
        ans=cnt=0;
        creat_prime(n);


        ans+=b-fun(b)-(a-1-fun(a-1));   // 这个 就不用  说了吧,  但还是 要注意   用  a-1   而不是a
        cout<
       
       
         < 
         
       
      
      
     
     
    
    
   
   

补充:刚学习了不用位运算,用数组来达到组合数的目的,原理大致相同,但写法不同,代码也上了,提醒自己一题多解
#include
     
     
      
      
#include
      
      
       
       
#define N 10000000
using namespace std;

int prime[N],cnt,tp[N],ans;
void creat_prime(int n)
{
    int i;
    for(i=2;i*i<=n;i++){
        if(n%i==0){
            prime[cnt++]=i;
            while(n%i==0) n/=i;
        }
    }
    if(n>1) prime[cnt++]=n;
}

int fun(int up)
{
    int i,t=0,j,k,sum=0;
    tp[t++]=-1; //保证奇加偶减
    for(i=0;i
       
       
        
        >T;
    while(T--){
        scanf("%d%d%d",&a,&b,&n);
        ans=cnt=0;
        creat_prime(n);

        ans=b-fun(b)-(a-1-fun(a-1));
        cout<
        
        
         
         <
         
         
        
        
       
       
      
      
     
     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值