整除分块

The Fool

Problem Description

The Fool is numbered 0 – the number of unlimited potential –and therefore does not have a specific place in the sequence of the Tarot cards. The Fool can be placed either at the beginning of the Major Arcana or at the end. The Major Arcana is often considered as the Fool’s journey through life and as such, he is
ever present and therefore needs no number.


Given n ∈ N+ , print the parity of

∑i=1N [ni ],


where [x] = max a (a∈Z,a≤x)

 

 

Input

The first line of the input contains one integer T ≤ 100, denoting the number of testcases. Then T testcases follow.
In each of the T testcases, there is a positive number n ≤ 109 .

 

 

Output

For each testcase, print a single line starting with “Case i : ”(i indicates the case number) and then “even” or “odd”, separated with a single space.

 

 

Sample Input

 

3 1 10000 100000000

 

 

Sample Output

 

Case 1: odd Case 2: even Case 3: even

 

 

Source

整除分块模板:


    for(int i=1,last;i<=n;i=last+1)
    {
	last=n/(n/i);  //该区间的最后一个数
	ans+=(last-i+1)*(n/i);
    }

解法1:n=10时

10 10 10 10 10 10 10 10 10 10

1   2   3    4    5   6   7   8   9   10

10  5   3    2     2   1   1   1   1   1

解法2:找规律: 每一串连续odd/even 的第一个数为平方数

这对任一个数开根号再取整奇偶性就出来了

50
Case 1: odd
Case 2: odd
Case 3: odd
Case 4: odd
Case 5: odd
Case 6: odd
Case 7: odd
Case 8: odd
Case 9: odd
Case 10: odd
Case 11: odd
Case 12: odd
Case 13: odd
Case 14: odd
Case 15: odd
Case 16: odd
Case 17: odd
Case 18: odd
Case 19: odd
Case 20: odd
Case 21: odd
Case 22: odd
Case 23: odd
Case 24: odd
Case 25: odd
Case 26: odd
Case 27: odd
Case 28: odd
Case 29: odd
Case 30: odd
Case 31: odd
Case 32: odd
Case 33: odd
Case 34: odd
Case 35: odd
Case 36: odd
Case 37: odd
Case 38: odd
Case 39: odd
Case 40: odd
Case 41: odd
Case 42: odd
Case 43: odd
Case 44: odd
Case 45: odd
Case 46: odd
Case 47: odd
Case 48: odd
Case 49: odd
Case 50: odd

#include<bits/stdc++.h> 
using namespace std;
int main()
{
    int t;
//    while(t--)
    scanf("%d",&t);
    for(int j=1;j<=t;j++)
    {
        int n;
        scanf("%d",&n);
        long long sum=0;
        
		for(int i=1,last;i<=n;i=last+1){
			last=n/(n/i); 
//			cout<<last<<endl; //该区间的最后一个数
			sum+=(last-i+1)*(n/i);
		}
        
        if(sum%2==0) printf("Case %d: even\n",j);
        else printf("Case %d: odd\n",j);
    }
}

 

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值